FloodFill 算法 (下)

目录

太平洋大西洋水流问题

题解:

扫雷游戏

题解:

衣橱整理


太平洋大西洋水流问题

417. 太平洋大西洋水流问题 - 力扣(LeetCode)

题解:

如果从区域内某一个位置出发,需要向左、向上走判断是否能到达太平洋,向右、向下走判断是否能到达大西洋,同时能到达太平洋和大西洋的位置,便是我们想要的答案,如果二维矩阵的每一个点都这样判断,时间复杂度很高,我们可以换个方向思考。

假设矩阵中的某一点存在一条路径可以到达太平洋,那么从这一点出发,这条路径中的相邻点的高度是单调递减的(非严格),相反,如果从太平洋出发,这条路径中的相邻点的高度是单调递增的(非严格),到达大西洋的路径也是同理。

那么我们可以从太平洋出发,找一条递增的路径,从大西洋出发,找一条递增的路径,如果这两条路径相交于同一点,那么这个点既可以流向太平洋,也可以流向大西洋。

于是问题转换为建立一个名为 pac 的 bool 类型的二维数组,从太平洋的边界(即第一行、第一列)出发,找出所有的递增路径,并把路径中的每个点标记为 true,大西洋也是同理,二维数组命名为 alt 。寻找递增路径的代码便为 FloodFill 算法。

之后再去遍历二维矩阵 heights:

1、如果 heights[ i ][ j ] 的 pac[ i ][ j ] 和 alt[ i ][ j ] 都为 true,则该点同时可以流向太平洋和大西洋,是我们想要的答案;

2、如果 heights[ i ][ j ] 的 pac[ i ][ j ] 和 alt[ i ][ j ] 有一个为 false,则该点无法同时流向太平洋和大西洋!

class Solution {
    int m,n;
    int dx[4]={0,0,1,-1};
    int dy[4]={1,-1,0,0};
public:
    vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
        m=heights.size(),n=heights[0].size();
        vector<vector<bool>> pac(m,vector<bool>(n));
        vector<vector<bool>> atl(m,vector<bool>(n));
        vector<vector<int>> ret;
        for(int i=0;i<n;i++) 
        {
            dfs(heights,pac,0,i);//第一行
            dfs(heights,atl,m-1,i);//最后一行
        }
        for(int i=0;i<m;i++) 
        {
            dfs(heights,pac,i,0);//第一列
            dfs(heights,atl,i,n-1);//最后一列
        }
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(pac[i][j] && atl[i][j]) ret.push_back({i,j});
            }
        }
        return ret;
    }
    void dfs(vector<vector<int>>& heights,vector<vector<bool>>& vis,int i,int j)
    {
        vis[i][j]=true;
        for(int k=0;k<4;k++)
        {
            int x=i+dx[k],y=j+dy[k];
            if(x>=0 && x<m && y>=0 && y<n && !vis[x][y] && heights[x][y]>=heights[i][j])
            {
                dfs(heights,vis,x,y);
            }
        }
    }
};

扫雷游戏

529. 扫雷游戏 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/minesweeper/description/

题解:

 这道题相当于给了一个点源:

1、如果该点是未挖出的雷(M),那么把这个雷标记为已挖出(X),并且直接返回盘面;

2、如果该点是未挖出的空方格(E),则把周围方格都递归的揭露:

a.如果方格周围 8 个方格都没有雷,则把该方格标记为 B,且继续递归,继续揭露;

b.如果方格周围 8 个方格存在雷,则标记出雷的个数,且不再递归。

 需要注意由于需要访问周围 8 个方格,所以 dx、dy 也需要根据偏移量设置为大小为 8 的数组。

class Solution {
    int dx[8]={0,0,1,-1,-1,-1,1,1};
    int dy[8]={1,-1,0,0,-1,1,-1,1};
    int m,n;
public:
    vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) {
        m=board.size(),n=board[0].size();
        int x=click[0],y=click[1];
        //踩雷
        if(board[x][y]=='M')
        {
            board[x][y]='X';
            return board;
        }
        dfs(board,x,y);
        return board;
    }
    void dfs(vector<vector<char>>& board, int i,int j)
    {
        //判断当前位置周围有没有地雷
        int count=0;
        for(int k=0;k<8;k++)
        {
            int x=i+dx[k],y=j+dy[k];
            if(x>=0 && x<m && y>=0 && y<n && board[x][y]=='M')  ++count;
        }
        //有地雷
        if(count)
        {
            board[i][j]=count+'0';
            return;
        }
        else//没有地雷
        {
            board[i][j]='B';
            for(int k=0;k<8;k++)
            {
                int x=i+dx[k],y=j+dy[k];
                if(x>=0 && x<m && y>=0 && y<n && board[x][y]=='E') 
                {
                    dfs(board,x,y);//没有地雷的地方继续向外扩展
                }
            }
        }
    }
};

衣橱整理

LCR 130. 衣橱整理 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof/description/

 这道题只需要向下和向右扩展。

lass Solution {
    int dx[2]={0,1};
    int dy[2]={1,0};
    
    bool vis[101][101];
public:
    int wardrobeFinishing(int m, int n, int cnt) {
        
        int ret=0;
        dfs(m,n,0,0,cnt,ret);
        return ret;
    }
    void dfs(int m, int n,int i,int j,int cnt,int& ret)
    {
        vis[i][j]=true;
        ++ret;
        for(int k=0;k<2;k++)
        {
            int x=i+dx[k],y=j+dy[k];
            if(x>=0 && x<m && y>=0 && y<n && !vis[x][y] && check(x,y,cnt))
                dfs(m,n,x,y,cnt,ret);
        }
    }
    bool check(int i,int j,int cnt)
    {
        int tmp=0;
        while(i)
        {
            tmp+=(i%10);
            i/=10;
        }
        while(j)
        {
            tmp+=(j%10);
            j/=10;
        }
        if(tmp>cnt) return false;
        else return true;
    }
    
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/659600.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WordPress子比主题美化-首页动态的图片展示

WordPress子比主题首页动态的图片展示 WordPress子比主题首页添加动态的图片展示&#xff0c;其他程序也可以用&#xff0c;复制代码到相应位置即可&#xff0c;也可作为指定分类&#xff0c;重点内容等&#xff0c;可以适合各个场景&#xff0c;需要的自取。 图片展示: 教程…

香橙派AIpro开发板初体验

香橙派AIpro开发板初体验 一、引言 在当前的AI发展浪潮中&#xff0c;边缘计算逐渐成为了研究的热点。香橙派AIpro开发板作为一款基于昇腾AI技术的开发板&#xff0c;凭借其强大的算力和丰富的接口&#xff0c;为AI边缘计算提供了强大的支持。最近&#xff0c;我也是拿到了官…

工作中有哪些超级好用的C/C++程序库?

视频和讲义发布在这里&#xff1a; B站链接

【Linux进程篇】Linux内核——程序地址空间的初构

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 程序地址空间回顾 我们在讲C语言的时候&#xff0c;大家应该都见过这样的空间布局图&#xff1a; 为了更好的验证不同的数据在内存中的存储位置&#xff0c;下面这段代码我们可以去实验一下&#xff1a; #include<…

通过ESP32芯片模组实现产品智能化升级,启明云端乐鑫代理商

随着科技的不断进步&#xff0c;物联网&#xff08;IoT&#xff09;已经渗透到我们生活的方方面面&#xff0c;成为现代生活不可或缺的一部分。在这场智能化革命中&#xff0c;乐鑫科技以其创新的ESP32芯片模组&#xff0c;为智能家居和智能设备的发展注入了新的活力。作为乐鑫…

【Flutter】交错动画自定义动画Hero动画

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Flutter学习 &#x1f320; 首发时间&#xff1a;2024年5月29日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e; 目…

虚拟化概述

虚拟存储器(Virtual Memory) 它的基本思想是对于一个程序来说,它的程序(code)、数据(data)和堆栈(stack)的总大小可以超过实际物理内存的大小&#xff1b;操作系统把当前使用的部分内容放到物理内存中&#xff0c;而把其他未使用的内容放到更下一级存储器&#xff0c;如硬盘&a…

Windows电脑高颜值桌面便利贴,便签怎么设置

在这个看颜值的时代&#xff0c;我们不仅在衣着打扮上追求时尚与美观&#xff0c;就连电脑桌面也不愿放过。一张唯美的壁纸&#xff0c;几款别致的小工具&#xff0c;总能让我们的工作空间焕发出不一样的光彩。如果你也热衷于打造高颜值的电脑桌面&#xff0c;那么&#xff0c;…

积鼎CFDPro水文水动力模型,专为中小流域洪水“四预”研发的流体仿真技术

水动力模型与水文模型是水利工程与水文学研究中不可或缺的两大工具。水动力模型着重于流体运动的动力学机制&#xff0c;通过一系列方程组捕捉水流的时空变化&#xff0c;而概念性水文模型则侧重于流域尺度的水文循环过程&#xff0c;利用物理概念与经验关系进行近似模拟。两者…

OpenBuild推出Sui Quiz任务,瓜分500SUI奖励

Quiz 功能 让用户可以&#xff1a; - 测试对某个知识点的理解力&#xff1b; 通过测试后获得 NFT 凭证&#xff0c;未来该凭证可用于求职认可、Bounty 任务、空投门槛。 Sui 是一个高性能的去中心化平台&#xff0c;旨在解决传统区块链系统中的可扩展性和效率问题。其独特的架…

win_os_linux不能用于文件名的保留字符

windows 在 Windows 文件系统中&#xff0c;以下字符是保留字符&#xff0c;不能用于文件名或目录名&#xff1a; < (小于号)> (大于号): (冒号)" (双引号)/ (斜杠)\ (反斜杠)| (竖线)? (问号)* (星号) 此外&#xff0c;文件名不能以空格或句点 (.) 结尾&#x…

win10如何查看本机ip地址?三招搞定,快来试试吧

在数字化时代&#xff0c;IP地址作为网络设备的唯一标识&#xff0c;对于计算机使用者来说具有重要意义。无论是为了进行网络设置、远程连接&#xff0c;还是解决网络问题&#xff0c;了解如何查看本机IP地址都是一项必备技能。对于使用Windows 10操作系统的用户来说&#xff0…

word 替换全部字母和数字为新罗马

步骤1&#xff0c;准备好一份测试文档 Adfafdafdafdafdsafdsafasdfdsa 汇总的时光发生的尬的算法的萨法asdfasfsafda大法师短发沙发上对方阿福的萨法的算法大法大方发达舒服打发到沙发上对方说 打发打发打发的负担啊大方阿道夫大法东方大厦发大水Ameti 1. Adafe我直打大噶特区…

2024-05-29 服务器开发-c++线程池与task-思考

摘要: 无论是什么系统&#xff0c;线程池和task都是给上层所提供的基础的功能单元。本文记录一些核心的设计思想。 线程池要面对的场景: 调用下层接口时&#xff0c;被IO阻塞&#xff0c;导致整个服务无法对外提供服务更上层调用本模块接口时&#xff0c;是需要做到同步&#…

WebGL实现医学教学软件

使用WebGL实现医学教学软件是一个复杂但非常有益的项目&#xff0c;可以显著提升医学教育的互动性和效果。以下是详细的实现步骤&#xff0c;包括需求分析、技术选型、开发流程和注意事项。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作…

[NLP]如何训练自己的大型语言模型

简介 大型语言模型&#xff0c;如OpenAI的GPT-4或Google的PaLM&#xff0c;已经席卷了人工智能领域。然而&#xff0c;大多数公司目前没有能力训练这些模型&#xff0c;并且完全依赖于只有少数几家大型科技公司提供技术支持。 在Replit&#xff0c;我们投入了大量资源来建立从…

2024长三角快递物流展即将亮相,致鸿物流器材有限公司值得关注

广东致鸿物流器材有限公司&#xff0c;前身为广州致鸿物流器材有限公司&#xff0c;成立于2002年初&#xff0c;是一家中国专业仓储笼研发制造公司&#xff0c;公司员工约400名&#xff0c;日产仓储笼制造规模近8000个&#xff0c;在全国范围内有五大配送服务中心&#xff1a;江…

降雨量应急监测站的工作原理

TH-YJ3】雨量监测站是一种自动化的气象监测设备&#xff0c;主要用于实时、准确地监测和记录降雨量数据。它通过安装在特定位置的传感器和数据处理设备&#xff0c;连续监测降雨的强度、持续时间和降雨分布等信息&#xff0c;为气象、水文、环境等领域的研究和应用提供数据支持…

Java常见集合类一(List)

一、Collection接口及其常见实现子类、子接口 由上图可以看出&#xff0c;Collection 接口实现了 Iterable 接口&#xff1b; Iterable接口是Java集合类中的核心接口之一&#xff0c;实现该接口的类具有迭代功能&#xff0c;它提供了能够对实现它的子类 中的元素进行逐个遍历的…

端午节趣味互动小游戏的作用是什么

端午节吃粽子&#xff0c;多数行业商家都可借势进行品牌营销&#xff0c;而一场营销效果的优劣&#xff0c;除了好方案外&#xff0c;还需要好的工具/渠道及运营等&#xff0c;围绕粽子元素的互动小游戏是营销互动的主要形式之一。 运用【雨科】平台拥有多款端午节粽子主题互动…