首页 > 其他分享 >力扣 leetcode 200. 岛屿数量

力扣 leetcode 200. 岛屿数量

时间:2022-12-04 17:00:10浏览次数:70  
标签:200 遍历 emplace 力扣 second grid && leetcode first

问题描述

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 300
  • grid[i][j] 的值为 '0' 或 '1'

示例

示例 1:

输入:grid = [
  ["1","1","1","1","0"],
  ["1","1","0","1","0"],
  ["1","1","0","0","0"],
  ["0","0","0","0","0"]
]
输出:1

示例 2:

输入:grid = [
  ["1","1","0","0","0"],
  ["1","1","0","0","0"],
  ["0","0","1","0","0"],
  ["0","0","0","1","1"]
]
输出:3

解题思路

这题要做的就是对图进行遍历,可以用深度优先搜索(DFS),也可以用广度优先搜索(BFS)。使用 DFS 时,用 保存下一个要遍历的位置;使用 BFS 时,使用 队列 保存下一个要遍历的位置。我们在遍历图时,将所有的 '1' 置为另一个符号,以避免重复遍历,统计最终我们的遍历次数即可。

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        stack<pair<int, int>> s; // DFS
        int res = 0;
        for(int i = 0; i < grid.size(); i++){
            for(int j = 0; j < grid[0].size(); j++){
                if(grid[i][j] == '1'){
                    res++; 
                    s.emplace(i, j); // 插入DFS的起点
                    grid[i][j] = 0;
                    while(!s.empty()){
                        pair<int, int> p = s.top();
                        s.pop();
                        if(p.first < (grid.size() - 1) && grid[p.first + 1][p.second] == '1'){ // 判断下方向是否是陆地
                            s.emplace(p.first + 1, p.second);
                            grid[p.first + 1][p.second] = 0;
                        }
                        if(p.first > 0 && grid[p.first - 1][p.second] == '1'){ // 判断上方向是否是陆地
                            s.emplace(p.first - 1, p.second);
                            grid[p.first - 1][p.second] = 0;
                        }
                        if(p.second < (grid[0].size() - 1) && grid[p.first][p.second + 1] == '1'){ // 判断左方向是否是陆地
                            s.emplace(p.first, p.second + 1);
                            grid[p.first][p.second + 1] = 0;
                        }
                        if(p.second > 0 && grid[p.first][p.second - 1] == '1'){ // 判断右方向是否是陆地
                            s.emplace(p.first, p.second - 1);
                            grid[p.first][p.second - 1] = 0;
                        }
                    }
                }
            }
        }
        return res;
    }
};

标签:200,遍历,emplace,力扣,second,grid,&&,leetcode,first
From: https://www.cnblogs.com/greatestchen/p/16950186.html

相关文章

  • 力扣刷题01
    704.二分查找给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:num......
  • 两两交换链表中的节点-LeetCode24模拟节点
    力扣链接:https://leetcode.cn/problems/swap-nodes-in-pairs/题目给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完......
  • [LeetCode] 1323. Maximum 69 Number 6和9组成的最大数字
    Youaregivenapositiveinteger num consistingonlyofdigits 6 and 9.Return themaximumnumberyoucangetbychanging atmost onedigit(6* becom......
  • leetcode.cn 17.电话号码的字母组合 - 生成组合数
    这题难度标为“中等”,那肯定不难。看完题,知道就是生成组合数。想起当年上学的时候我还做过一个组合工具类。于是在磁盘上搜索,找到一看,原来当年是Java写的一个类,代码也很简......
  • Leetcode 1796 寻找字符串中第二大的数字
    Leetcode1796寻找字符串中第二大的数字1、两次遍历(省略)2、一次遍历(max和second变量,代码省略)3、范围0-9,桶排序(代码如下)classSolution{public:intsecondHig......
  • LeetCode刷题记录.Day30
    二叉树的前序遍历递归遍历法classSolution{public:voidtraversal(TreeNode*cur,vector<int>&result){if(cur==NULL)return;//当前节点为空,终......
  • #yyds干货盘点# LeetCode程序员面试金典:旋转矩阵
    题目:给你一幅由N×N矩阵表示的图像,其中每个像素的大小为4字节。请你设计一种算法,将图像旋转90度。不占用额外内存空间能否做到? 示例1:给定matrix=[ [1,2,3],......
  • 力扣 leetcode 438. 找到字符串中所有字母异位词
    问题描述给定两个字符串s和p,找到s中所有p的异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词指由相同字母重排列形成的字符串(包括相同的字......
  • 西门子S7-200PLC工具软件,包含200系列编程软件、PPI驱动、密码识别工具
    关注微信公众号【工控羊】或者微信号【gksheep】,微信公众号后台输入数字编号【0026】即可获取下载链接。......
  • LeetCode刷题笔记
    前言:我是从大四上学期开始刷算法题的,那时候比较迷茫,不知道做什么。想着提升一下自己,就看着B站代码随想录的视频,然后开始在力扣上刷题。当你陷入迷茫,不知道学什么的时候,只要......