本题没有解出实在是不应该,只看难度的话,就是一道非常常规的Medium,可能是太困了,我进入了一种思维误区,把这个表示朋友关系的表当作一个真正的“图”了,来前后左右分别遍历,但其实不是这样,应该只看一个row,这才是某一点的遍历。
- 设定一个一维数组
visited[i]
表示第i个人是否已经被访问
traverse function:
private void traverse(int[][] M, int cur, boolean[] visited) {
for (int i = 0; i < M.length; ++i) {
if (!visited[i] && M[cur][i] == 1) {
visited[i] = true;
traverse(M, i, visited);
}
}
}
- 时间复杂度: worst case是每个人都需要遍历一下其他人是不是朋友,所以是
- 空间复杂度: 数组visited,所以是
代码如下:
class Solution {
public int findCircleNum(int[][] M) {
int sz = M.length;
boolean[] visited = new boolean[sz];
int cnt = 0;
for (int i = 0; i < sz; ++i) {
if (visited[i]) {
continue;
}
visited[i] = true;
traverse(M, i, visited);
++cnt;
}
return cnt;
}
private void traverse(int[][] M, int cur, boolean[] visited) {
for (int i = 0; i < M.length; ++i) {
if (!visited[i] && M[cur][i] == 1) {
visited[i] = true;
traverse(M, i, visited);
}
}
}
}