Number of Islands
来源:互联网 发布:json和jsonp的区别 编辑:程序博客网 时间:2024/06/07 19:59
问题描述:
Given a 2d grid map of ‘1’s (land) and ‘0’s (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.
Example1:
11110
11010
11000
00000
Answer:1
Example2:
11000
11000
00100
00011
Answer:3
思路分析:
这道题刚开始的时候有点无从下手,但仔细理解题目的第二句话,我们可以提取出这样一个信息:island是由水平或者垂直方向相邻的land组成的连通区域,周围都是water,于是抽象为图模型就是要找到“0”和“1”的图中连通的“1”区域的数量。进一步,我们可以使用图论中两个基本的搜索算法DFS和BFS,快速解决问题。这里选择DFS深度优先搜索算法,大概步骤是:
1)声明一个visited的二维vector,初始化值全为“0”,已经访问过的节点的visited值改成“1”;
2)遍历图中的各个节点,如果节点的值为“1”且visited值为“0”,那么就调用countIslands函数,DFS找到该节点相邻的所有“1”节点,这块区域就是一个island。注意DFS过程就是递归调用countIslands函数,只是将此函数的参数row和column值修改为该节点的上、下、左、右四个相邻节点的相应row和column值而已。
代码实现:
class Solution {public: int numIslands(vector<vector<char>>& grid) { if (grid.empty()) return 0; else { int row = grid.size(); int column = grid[0].size(); int number = 0; //island的数量 vector<vector<int>> visited; //初始化二维vector visited.resize(row); for (int k = 0; k < row; k++) { visited[k].resize(column); } for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) { //注意grid的元素类型是char而不是int if (!visited[i][j] && grid[i][j] == '1') { countIslands(grid, visited, i, j); number++; } } } return number; } } void countIslands(vector<vector<char>>& grid, vector<vector<int>>& visited, int row, int column) { //row和column超过grid范围 if (row < 0 || row > grid.size()-1 || column< 0 || column > grid[0].size()-1) { return; } //“0”位置或者访问过的"1"位置 if (grid[row][column] != '1' || visited[row][column]) { return; } //找到一块连通的“1”区域 else { visited[row][column] = 1; countIslands(grid, visited, row, column-1); countIslands(grid, visited, row, column+1); countIslands(grid, visited, row-1, column); countIslands(grid, visited, row+1, column); } }};
- Number of Islands
- Number of Islands
- Number of Islands
- [LeetCode] Number of Islands
- Leetcode-Number of Islands
- Number of Islands
- Leetcode Number of Islands
- [LeetCode]Number of Islands
- Number of Islands
- Number of Islands
- [leetcode]Number of Islands
- [leetcode] Number of Islands
- leetcode Number of Islands
- leetcode:Number of Islands
- [leetcode] Number of Islands
- 200 Number of Islands
- [LeetCode] Number of Islands
- Number of Islands
- 详解vue之vuex
- 自由幻想UI之成就界面
- Html 的小误区
- virtualenv
- 操作系统-死锁
- Number of Islands
- ST表学习
- 【操作系统】第一章小结
- Python笔记之http.client模块
- springMVC中遇到乱码问题
- Spring myBatis数据库连接异常
- [hdu 2276]Kiki & Little Kiki 2
- 斐波那契数列和数组去重算法
- 大话flash和eeprom