lc547:省份数量
题目解读:
①n个城市,矩阵中隐含了城市数量,换句话说就是矩阵给出了城市数量以及连接关系
②题目抽象为有多少个直接或者间接可达的关系
思路:
类似树的遍历,深度优先遍历或者广度优先遍历,但是要注意标记哪些城市是已经访问过的,避免重复访问,可以使用标记数组进行标记。
深度优先解法的解析:
当发现当前城市未被访问过时,以其作为起点进行深度遍历。
并且需要查看城市i与哪些城市相连时,只需要查看矩阵中第i行(第i列一样矩阵是对称的)中哪一些为1即可,所以只需要遍历该行即可
具体代码:
public int findCircleNum(int[][] isConnected) {
int cities = isConnected.length;
boolean[] seen = new boolean[cities];
int res = 0;
for(int i=0;i<cities;i++){
//作为起点
if(!seen[i]){
dfs(isConnected,seen,cities,i);
res++;
}
}
return res;
}
public void dfs(int[][] isConnected,boolean[] seen,int cities,int i){
//遍历对应的行
for(int j= 0;j<cities;j++){
if(isConnected[i][j]==1&&!seen[j]){
seen[j]=true;
//深度遍历,同样是调用dfs去遍历对应的行
dfs(isConnected,seen,cities,j);
}
}
}