liuxuhelloworld's notebook

题目链接

https://leetcode-cn.com/problems/number-of-provinces/

解答过程

DFS

这个题目我一开始写错了,把问题想简单了,一开始我的理解是计数二维数组中互相连通的值为1的区域有几个,也就是和Problem130、Problem200类似。提交以后当然没通过,看了下报错的测试用例才明白这个题目的不同之处。Problem130、Problem200这些题目里,每个元素是独立的个体,以自身的值为依据做连通。而这个题目里,需要理解成以行或列为独立的个体,元素值表示的是这些个体之间是否连通。稍微再思考一下,才明白这个题目等于是给了一个图,要计算的是有多少连通的子图。对图算法敏感的话,应该第一时间就明白就是计算图的连通分量数目,可惜我对图算法的掌握太差……。从代码的角度看,Problem130、Problem200是以二维数组的每个元素为粒度做DFS,这个题目是以图的节点为粒度做DFS.

	public int findCircleNum(int[][] isConnected) {
		int len = isConnected.length;

		boolean[] visited = new boolean[len];

		int num = 0;
		for (int i = 0; i < len; i++) {
			if (!visited[i]) {
				num++;
				dfs(isConnected, visited, i);
			}
		}

		return num;
	}

	private void dfs(int[][] isConnected, boolean[] visited, int i) {
		visited[i] = true;
		for (int j = 0; j < isConnected.length; j++) {
			if (isConnected[i][j] == 1
				&& !visited[j]) {
				dfs(isConnected, visited, j);
			}
		}
	}