随手练——LintCode 433 - 小岛数量
LintCode 433: https://www.lintcode.com/problem/number-of-islands/description
LintCode 434: https://www.lintcode.com/problem/number-of-islands-ii/description(问法变了一下,思想还是一样的。)
解题思想:“感染“,从头开始遍历,碰到1,res++,开始感染,把所有相邻的1全部变成0,遍历完成,res就是结果。
题目是在B站上看到的一个老师的讲解:https://www.bilibili.com/video/av42241070/?p=8,不知道视频能存活多久。不过老师讲的是感染成 2,感染成 0
,也是一样的。
这题要注意的就是测试数据里有一个空数据,一定要处理,网站给看哪个样例不过,如果是看不到测试数据的,又该自闭了。
class Solution { public: /** * @param grid: a boolean 2D matrix * @return: an integer */ void infect(vector<vector<bool>> &a,int i,int j,int N,int M) { if (i < 0 || i >= N || j < 0 || j >= M||a[i][j]!=1) { return; } a[i][j] = 0; infect(a, i + 1, j, N, M); infect(a, i - 1, j, N, M); infect(a, i, j + 1, N, M); infect(a, i, j - 1, N, M); } int numIslands(vector<vector<bool>> &grid) { // write your code here if(grid.empty()) return 0; int N = grid.size(); int M = grid[0].size(); int res = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (grid[i][j] == 1) { infect(grid, i, j, N, M); res++; } } } //cout << res << endl; return res; } };
问题还有个升级:
将海域一切为二,分开求,但是最终还是要给出整片海域的岛屿数量。
就是比如:左边求出来是1个,右边求出来是2个,但其实还是一个岛屿。
牵扯到并查集(数据结构——并查集(2019-02-05 17:00)),每个点,在被感染的同时,标记上是被哪个点为中心感染的,最后撸两边的边界,不是同一个点感染的,就Union。