当前位置: 首页 > news >正文

【力扣hot100题】(050)岛屿数量

一开始还以为会很难很难(以为暴力搜索会时间超限要用别的办法),没想到并不难。

我最开始是用vector<vector<bool>>记录搜索过的地域,每次递归遍历周围所有地域。

class Solution {
public:
    vector<vector<char>> grid;
    vector<vector<bool>> pass;
    void spread(int i,int j,vector<vector<bool>>& pass){
        if(i>=0&&j>=0&&grid.size()>i&&grid[0].size()>j&&grid[i][j]=='1'&&pass[i][j]==0) pass[i][j]=1;
        else return;
        spread(i+1,j,pass);
        spread(i,j+1,pass);
        spread(i-1,j,pass);
        spread(i,j-1,pass);
    }
    int numIslands(vector<vector<char>>& grid) {
        vector<vector<bool>> pass(grid.size(),vector<bool>(grid[0].size(),0));
        this->pass=pass;
        this->grid=grid;
        int result=0;
        for(int i=0;i<grid.size();i++){
            for(int j=0;j<grid[0].size();j++){
                if(pass[i][j]==1||grid[i][j]=='0') continue;
                else{
                    result++;
                    spread(i,j,pass);
                }
            }
        }
        return result;
    }
};

后来想想可不可以直接修改原grid,这里出现了一个问题:

class Solution {
public:
    vector<vector<char>> grid;
    void spread(int i,int j){
        if(i>=0&&j>=0&&grid.size()>i&&grid[0].size()>j&&grid[i][j]=='1') grid[i][j]='0';
        else return;
        spread(i+1,j);
        spread(i,j+1);
        spread(i-1,j);
        spread(i,j-1);
    }
    int numIslands(vector<vector<char>>& grid) {
        this->grid = grid;
        int result=0;
        for(int i=0;i<grid.size();i++){
            for(int j=0;j<grid[0].size();j++){
                if(grid[i][j]=='0') continue;
                else{
                    result++;
                    spread(i,j);
                }
            }
        }
        return result;
    }
};

出现的大问题就是我明明将grid设为了类里共有的存储,可是函数spread修改grid并没有修改到实际grid,问了ai也不知道为什么。

答案是直接将grid传入函数,还是没弄明白为什么this->grid=grid不管用了。总之按答案做就行了。

答案还有一种广度优先搜索,其实我觉得逻辑还是深度优先,就是和我原先的做法一样设置一个bool二维数组判断是否遍历过,然后没遍历一个没遍历过的点就压入队列,不断扩散直到队列为空(感觉就是dfs,不知道为什么叫做bfs…………)

所以就没有写了。

还有一种是并查集,大概是设置两个数组记录节点,一个记录父节点信息(每个岛屿最先遍历到的点的标识),一个记录岛屿的大小。一开始将每一个地块都记为一个父节点,岛屿大小都设为0,记录“岛屿”数量,然后慢慢遍历,在遍历的过程中将相邻的地块合并为一个并查集,记录值慢慢减小。

http://www.dtcms.com/a/112070.html

相关文章:

  • 消息队列之-Kafka
  • #Linux内存管理# 在ARM32bit Linux中,高端内存的起始地址是如计算出来的?
  • 思二勋:未来所有的业务都将生于AI、长于AI、成于AI
  • 搜索二维矩阵
  • 笔记:代码随想录算法训练营day65:dijkstra(堆优化版)精讲、Bellman_ford 算法精讲
  • Docker安装、配置Redis
  • 使用Expo框架开发APP——详细教程
  • 【JavaScript】原型链 prototype 和 this 关键字的练习(老虎机)
  • 安当TDE透明加密:构建跨地域文件服务器安全传输的“双重保险“
  • VBA中类的解读及应用第二十二讲:利用类判断任意单元格的类型-5
  • C语言:3.31
  • 【YOLO系列(V5-V12)通用数据集-火灾烟雾检测数据集】
  • 大模型学习四:‌DeepSeek Janus-Pro 多模态理解和生成模型 本地部署指南(折腾版)
  • 七均线策略思路
  • Mac VM 卸载 win10 安装win7系统
  • Win7下安装高版本node.js 16.3.0 以及webpack插件的构建
  • Apache Camel指南-第四章:路由径构建之异常处理
  • 如何使用 IntelliJ IDEA 开发命令行程序(或 Swing 程序)并手动管理依赖(不使用 pom.xml)
  • 从飞机的状态矩阵A阵求运动模态的特征根、求传递函数矩阵
  • NOIP2013提高组.华容道
  • 从菜鸟到高手的提示词优化指南‌
  • Muduo网络库介绍
  • Sensodrive力控关节模组SensoJoint:TÜV安全认证助力机器人开发
  • 主机和虚拟机间的网络通信
  • LeetCode算法题(Go语言实现)_29
  • JavaScript重难点突破:事件循环
  • 基于 Python 的自然语言处理系列(70):检索增强生成(RAG)
  • Go语言-初学者日记(八):构建、部署与 Docker 化
  • 《操作系统真象还原》第五章(2)——启用内存分页机制
  • 蓝桥杯15届 宝石组合