博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode]Number of Islands
阅读量:6844 次
发布时间:2019-06-26

本文共 2678 字,大约阅读时间需要 8 分钟。

Number of Islands

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.

Example 1:

11110110101100000000

Answer: 1

Example 2:

11000110000010000011

Answer: 3

分析

这道题思路比较直接,显然就是从值为‘1’的点BFS或DFS,访问过的点做标记,直到搜索结束,一共可以进行几次搜索就意味着有多少个Islands.

至于对访问的点做标记,我们可以用一个boolean数组标记,如果可以修改原数组的话,我们也可以直接把访问过的原先是‘1’的点改成‘0’来标记已访问即可。我写的代码是用后者。

复杂度

BFS: time: O(n), space: O(n)

DFS: time: O(n), space: O(h)
这里n表示值为‘1’的点的个数,h表示DFS深度

代码

- DFS

public class Solution {    public int numIslands(char[][] grid) {        int rows = grid.length;        if (rows == 0) {            return 0;        }        int cols = grid[0].length;        int res = 0;        for (int i = 0; i < rows; i++) {            for (int j = 0; j < cols; j++) {                if (grid[i][j] == '1') {                    res++;                    dfs(grid, i, j);                }            }        }        return res;    }        private void dfs(char[][] grid, int row, int col) {        if (row < 0 || row >= grid.length || col < 0 || col >= grid[0].length || grid[row][col] == '0') {            return;        }                // 访问过的做标记        grid[row][col] = '0';                   // 搜邻居        dfs(grid, row - 1, col);        dfs(grid, row + 1, col);        dfs(grid, row, col - 1);        dfs(grid, row, col + 1);    }}

- BFS

public class Solution {    public int numIslands(char[][] grid) {        int rows = grid.length;        if (rows == 0) {            return 0;        }        int cols = grid[0].length;        int count = 0;        for (int i = 0; i < rows; i++) {            for (int j = 0; j < cols; j++) {                if (grid[i][j] == '1') {                    count++;                    bfs(grid, i, j);                }            }        }        return count;    }        private void bfs(char[][] grid, int row, int col) {        Queue
q = new LinkedList
(); int[][] dirs = new int[][]{
{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; q.add(new int[]{row, col}); grid[row][col] = '0'; while (!q.isEmpty()) { int[] top = q.remove(); for (int i = 0; i < dirs.length; i++) { int x = dirs[i][0] + top[0]; int y = dirs[i][1] + top[1]; if (x >= 0 && x < grid.length && y >= 0 && y < grid[0].length) { if (grid[x][y] == '1') { grid[x][y] = '0'; q.add(new int[]{x, y}); } } } } }}

转载地址:http://lxpul.baihongyu.com/

你可能感兴趣的文章
练习ng-show和ng-hide的方法
查看>>
2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告
查看>>
Scrapy爬虫框架教程(四)-- 抓取AJAX异步加载网页
查看>>
HBase - 数据写入流程解析
查看>>
Redis(十三):Redis分布式锁的正确实现方式
查看>>
Markdown 语法整理大集合2017
查看>>
为 MariaDB 配置远程访问权限
查看>>
特征选择常用算法综述
查看>>
中小型网站的缓存策略
查看>>
巧用EasyRadius计费策略设置灵的计费费率,保证帐目一目了然
查看>>
POJ 3076 Sudoku
查看>>
margin:0 auto;不居中问题 DOCTYPE声明滴重要性
查看>>
提高 sql server 性能
查看>>
C#打开并修复word实现方法
查看>>
[WinForm]DataGridView列头右键菜单
查看>>
php自动转义
查看>>
POJ-2502 Subway
查看>>
python调用Shell脚本:os.system(cmd)或os.popen(cmd)【转】
查看>>
wifi简介
查看>>
C++默认构造函数
查看>>