省份数量(力扣)深度优先 JAVA

有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市c 间接相连。

省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。

给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。

返回矩阵中 省份 的数量。

省份数量(力扣)深度优先 JAVA_第1张图片

输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]
输出:2

省份数量(力扣)深度优先 JAVA_第2张图片

输入:isConnected = [[1,0,0],[0,1,0],[0,0,1]]
输出:3

提示:

1 <= n <= 200
n == isConnected.length
n == isConnected[i].length
isConnected[i][j] 为 1 或 0
isConnected[i][i] == 1
isConnected[i][j] == isConnected[j][i]

解题思路:

1、既然属于相同省份的城市是连在一起的,那么可以借助感染的思维,通过第一个接触的省份,感染到和它相邻的省份

2、需要设立布尔visit数组,标记已经遍历过的城市,用dfs即可

代码:

class Solution {
    public int findCircleNum(int[][] isConnected) {
           int len = isConnected.length;
           boolean visit[] = new boolean[len];
           int res = 0;
           for(int i = 0; i < len; i ++) {
        	   if(!visit[i]) {
        	     dfs(visit, isConnected, len, i);
        	     res ++;
        	   }
           }
           return res;
    }
    public void dfs(boolean visit[], int isConnected[][], int len, int x) {
    	visit[x] = true;
    	for(int i = 0; i < len; i ++) {
    		if(isConnected[x][i] == 1 && !visit[i]) dfs(visit, isConnected, len, i);
    	}
    }
}

在这里插入图片描述

你可能感兴趣的:(深度优先,leetcode,java)