哎呀,这个题怎么说呢,我想的是找出所有的点来,但是怎么找呢,我想着从后往前找,但是遇到一个问题,因为有点复杂我也没有去找,尝试几次之后我就放弃了,然后就开始想正着找出来,也没有想到什么好的方法,后来就突然想到其实可以去找不是的点,有想到不是的点最终其实都会和回路有关系,所以搜索一下其实就解决了,我还花了这么长时间想别的方法。 把题解的代码放在下面把,作为正确的题解,然后再把我的错误代码放在下面,我觉得我的方法应该也可以做出来,但是也需要做上标记来确定回路,等下次再仔细看看。 题解:
class Solution {
public List<Integer> eventualSafeNodes(int[][] graph) {
int n = graph.length;
int[] color = new int[n];
List<Integer> ans = new ArrayList<Integer>();
for (int i = 0; i < n; ++i) {
if (safe(graph, color, i)) {
ans.add(i);
}
}
return ans;
}
public boolean safe(int[][] graph, int[] color, int x) {
if (color[x] > 0) {
return color[x] == 2;
}
color[x] = 1;
for (int y : graph[x]) {
if (!safe(graph, color, y)) {
return false;
}
}
color[x] = 2;
return true;
}
}
作者:LeetCode-Solution
我的:
class Solution {
public List<Integer> eventualSafeNodes(int[][] graph) {
int[][] map=new int[graph.length][graph.length];
List<Integer> list=new ArrayList<>();
LinkedList<Integer> yes=new LinkedList<>();
List<Integer> no=new ArrayList<>();
for(int i=0;i<graph.length;i++){
boolean flag=true;
map[i][i]=1;
for(int j=0;j<graph[i].length;j++) {
map[i][graph[i][j]]=1;
flag=false;
}
if (flag)yes.add(i);
else no.add(i);
}
int n=graph.length;
while(n!=0){
if(!yes.isEmpty()){
Integer integer = yes.pollFirst();
int sum=0;
for(int j=0;j<graph.length;j++){
if(map[j][integer]==1&&!yes.contains(j)&&integer!=j&&!list.contains(j))yes.add(j);
if(!list.contains(j))sum+=map[integer][j];
}
if(sum==1)list.add(integer);
}
n--;
}
list.sort(Integer::compareTo);
return list;
}
}
|