递归算法学习——被围绕的区域,太平洋大西洋流水问题

news2024/11/26 5:20:33

目录

​编辑

一,被围绕的区域

1.题意

2.解释

3.题目接口

4.解题思路及代码

二,太平洋大西洋流水问题

1.题意

2.解释

3.题目接口

 4.解题思路及代码


一,被围绕的区域

1.题意

给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。

2.解释

如下图所示:  

该图中只有最底下的字母O没有被改为字符X,因为它下边没有被字符X给围绕,所以这个字符O不用被修改,但是其它几个O是连在一起的并且是被字符X给围绕起来的所以就会被修改为字符X。

3.题目接口

class Solution {
public:
    void solve(vector<vector<char>>& board) {

    }
};

4.解题思路及代码

这道题其实是比较考验思维的,因为如果我们采用直接遍历的方法来解决的话会很吃力,因为我们要处理的情况太多了。这个时候我们就可以采取逆向的思维解决这道题了。这道题,要我们找到符合条件的可以改为字符X的字符O,这是正向的思维。逆向的思维便是找到不符合条件的O然后将这些O给标记一下不能改为X。具体的代码如下:

class Solution {
public:
    int m,n;
    int dx[4] = {0,0,1,-1},dy[4] = {1,-1,0,0};
    void solve(vector<vector<char>>& board) {
        m = board.size();
        n = board[0].size();
        
        //先从边界开始找到不符合条件的字符O改为一个特定的符号'.'
        for(int i = 0;i<m;i++)
        {
             if(board[i][0] == 'O')
             {
                 dfs(board,i,0);
             }

             if(board[i][n-1] == 'O')
             {
                 dfs(board,i,n-1);
             }
        } 

        for(int j = 0;j<n;j++)
        {
            if(board[0][j]=='O')
            {
                dfs(board,0,j);
            }

            if(board[m-1][j]=='O')
            {
                dfs(board,m-1,j);
            }
        }

        //遍历全员,将标记过的字符改为O,把字符为O的改为X
        for(int i = 0;i<m;i++)
        {
            for(int j = 0;j<n;j++)
            {
                if(board[i][j] == '.')
                {
                    board[i][j] = 'O';
                }
                else if(board[i][j]=='O')
                {
                    board[i][j] = 'X';
                }
            }
        }
           
    }

    void dfs(vector<vector<char>>&board,int i,int j)
    {
        board[i][j] = '.';

        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&&board[x][y]=='O')
            {
                dfs(board,x,y);
            }
        }
    }
};

二,太平洋大西洋流水问题

1.题意

有一个 m × n 的矩形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。

这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n 的整数矩阵 heights , heights[r][c] 表示坐标 (r, c) 上单元格 高于海平面的高度 。

岛上雨水较多,如果相邻单元格的高度 小于或等于 当前单元格的高度,雨水可以直接向北、南、东、西流向相邻单元格。水可以从海洋附近的任何单元格流入海洋。

返回网格坐标 result 的 2D 列表 ,其中 result[i] = [ri, ci] 表示雨水从单元格 (ri, ci) 流动 既可流向太平洋也可流向大西洋 。

2.解释

如图所示:

既能流向太平洋又能流向大西洋的格子便是被改为浅黄色的格子。这些格子都有一些特点便是这些格子都能从自己的位置开始由高到低的流向两边的两个大洋。我们的任务便是要找到这些格子然后将这些格子的下标给记录下来返回便是了。

3.题目接口

class Solution {
public:
    vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {

    }
};

 4.解题思路及代码

这道题的解题思路和前面的那道题的解题思路其实也差不多,也是一个逆向思维的解法。先要明确的是水往低处流,所以我们从边界出发,因为边界的格子是和海洋相接的所以比边界高的格子便可以由边界流向海洋。然后比这个格子高的格子便可以由这个格子经过边界的格子流向海洋,这是一个递进的关系。只要我们将能流向某个大洋的这些格子标记一下,当一个格子有两种标记时便是可以流向两个大洋的,这些格子便是我们要找的。写成代码如下:

class Solution {
public:
    int m,n;
    int dx[4] = {0,0,1,-1},dy[4] = {1,-1,0,0};
    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>>alt(m,vector<bool>(n));

        //寻找比边界高的格子并标记
        for(int i = 0;i<m;i++) dfs(heights,i,0,pac);//左列

        for(int i = 0;i<m;i++) dfs(heights,i,n-1,alt);//右列

        for(int j = 0;j<n;j++) dfs(heights,0,j,pac);//第一行

        for(int j = 0;j<n;j++) dfs(heights,m-1,j,alt);//最后一行


        //记录结果
        vector<vector<int>>ret;
        for(int i = 0;i<m;i++)
        {
            for(int j = 0;j<n;j++)
            {
                if(pac[i][j]&&alt[i][j])
                {
                     ret.push_back({i,j});
                }
            }
        }
       
       return ret;
    }

    void dfs(vector<vector<int>>&heights,int i,int j,vector<vector<bool>>&vis)
    {
        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,x,y,vis);
            }
        }
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

对卷积的一点具象化理解

前言 卷积的公式一般被表示为下式&#xff1a; 对新手来说完全看不懂这是干什么&#xff0c;这个问题需要结合卷积的应用场景来说。 原理 卷积比较广泛的应用是在信号与系统中&#xff0c;所以有些公式的定义会按照信息流的习惯。假设存在一串信号g(x)经过一个响应h(x)时他的响…

高云USB下载器仿真器用户手册(包括在线逻辑分析仪的使用方法)

高云 USB 仿真器用户手册 一.简介 仿真器用于高云 GOWIN 公司所生产的 FPGA&#xff0c;可用于程序下载和调试。主要特点如下&#xff1a; 1.支持宽电压1.2V - 3.6V&#xff1b; 2.速度最高可达30Mb/s&#xff0c;极速完成下载和波形调试功能&#xff1b; 3.完美支持在线逻…

Java实现Modbus读写数据

背景 由于当时项目周期赶&#xff0c;引入了一个PLC4X组件&#xff0c;上手快。接下来就是使用这个组件遇到的一些问题&#xff1a; 关闭连接NioEventLoop没有释放导致oom设计思想是一个设备一个连接&#xff0c;而不是一个网关一个连接连接断开后客户端无从感知 前两个问题解…

什么牌子的电容笔比较好?开学值得买触控笔推荐

大部分学生都没有固定的收入&#xff0c;所以他们选择的商品都是偏向性价比高的。随着iPad的不断升级&#xff0c;它的各种功能也会越来越多&#xff0c;将会慢慢地走进我们的生活和工作中。随着电子设备的不断更新和软件的完善&#xff0c;电容笔的性能也在不断提高&#xff0…

783. 二叉搜索树节点最小距离

783. 二叉搜索树节点最小距离 C代码&#xff1a;二叉树 int min; int pre;int dfs(struct TreeNode* root) {if (root NULL) {return;}dfs(root->left);if (pre ! -1) {min fmin(min, root->val - pre);}pre root->val; // 中序遍历dfs(root->right); }int mi…

【深度学习】 Python 和 NumPy 系列教程(三):Python容器:1、列表List详解(初始化、索引、切片、更新、删除、常用函数、拆包、遍历)

目录 一、前言 二、实验环境 三、Python容器&#xff08;Containers&#xff09; 0、容器介绍 1、列表&#xff08;List&#xff09; 1. 初始化 a. 创建空列表 b. 使用现有元素初始化列表 c. 使用列表生成式 d. 复制列表 2. 索引和切片 a. 索引 b. 负数索引 c. 切…

MySQL触发器详解保证入土

文章目录 简介一、MySQL触发器基础触发器分类基础常用关键字1. 定义触发器2. 创建和删除触发器3. 执行时机和条件 二、MySQL触发器的使用场景1. 数据完整性约束插入触发器更新触发器删除触发器 2. 数据变更日志的记录与追踪3. 触发器与存储过程的对比与选择 三、触发器的性能和…

强大的JTAG边界扫描(5):FPGA边界扫描应用

文章目录 1. 获取芯片的BSDL文件2. 硬件连接3. 边界扫描测试4. 总结 上一篇文章&#xff0c;介绍了基于STM32F103的JTAG边界扫描应用&#xff0c;演示了TopJTAG Probe软件的应用&#xff0c;以及边界扫描的基本功能。本文介绍基于Xilinx FPGA的边界扫描应用&#xff0c;两者几乎…

巨人互动|Facebook海外户Facebook风控规则有什么

Facebook是全球最大的社交媒体平台之一&#xff0c;每天有数十亿的用户在其上发布、分享和交流各种内容。为了维护平台的安全性和用户体验&#xff0c;Facebook制定了严格的风控规则来监测和处理违规行为。下面小编讲讲Facebook风控规则。 巨人互动|Google海外户&Google Ad…

CocosCreator3.8研究笔记(十一)CocosCreator Prefab(预制件)理解

相信很多朋友都不知道 Prefab 是什么&#xff1f;为什么要使用Prefab &#xff1f; 怎么使用Prefab&#xff1f; 接下来&#xff0c;我们就一步一步来揭晓答案。 一、Prefab 是什么 &#xff1f; Prefab&#xff1a;大家习惯性地称为“预制件” 或“预制体” &#xff0c;简单说…

Java事件机制简介 内含面试题

面试题分享 云数据解决事务回滚问题 点我直达 2023最新面试合集链接 2023大厂面试题PDF 面试题PDF版本 java、python面试题 项目实战:AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮…

昇腾Ascend TIK自定义算子开发教程(概念版)

一、参考资料 【2023 CANN训练营第一季】Ascend C算子开发入门&#xff08;中&#xff09; 二、重要说明 TIK2编程范式把算子核内的处理程序&#xff0c;分成多个流水任务&#xff0c;任务之间通过队列&#xff08;Queue&#xff09;进行通信和同步&#xff0c;并通过统一的…

MySQL——备份和还原

备份 热备 即MySQL服务在运行的时候进行的备份 mysqldump命令 mysqldump --databases db1 db2 db3 > dump.sql mysqldump -uroot -pSanchuang1234# --all-databases >all_db.sql mysqldump -uroot -pSanchuang123# --databases TENNIS >/backup/tennis.sql mysq…

分享一个python基于数据可视化的智慧社区服务平台源码

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1…

【rust/egui】(九)使用painter绘制一些图形—基本使用

说在前面 rust新手&#xff0c;egui没啥找到啥教程&#xff0c;这里自己记录下学习过程环境&#xff1a;windows11 22H2rust版本&#xff1a;rustc 1.71.1egui版本&#xff1a;0.22.0eframe版本&#xff1a;0.22.0上一篇&#xff1a;这里 painter 定义pub struct Painter {///…

领域驱动设计:DDD分层架构

文章目录 DDD 分层架构DDD 分层架构最重要的原则DDD 分层架构推动架构演进三层架构如何演进到 DDD 分层架构 微服务架构模型有好多种&#xff0c;例如整洁架构、CQRS 和六边形架构等等。每种架构模式虽然提出的时代和背景不同&#xff0c;但其核心理念都是为了设计出“高内聚低…

gpt测试

已知a地一石头售价80&#xff0c;b地售价112&#xff0c;小明初始资金8000&#xff0c;在a地全仓购入后&#xff0c;去b地出售&#xff0c;然后小明又回到a地&#xff0c;再次全仓购入然后去b地出售&#xff0c;这样继续出售10次后&#xff0c;小明有多少钱&#xff1f;石头是不…

Java中wait和notify详解

线程的调度是无序的&#xff0c;随机的&#xff0c;但是也是有一定的需求场景&#xff0c;希望能够有序执行&#xff0c;join算是一种控制顺序的方式&#xff08;功能有限&#xff09;——》一个线程执行完&#xff0c;才能执行另一个线程&#xff01; 本文主要讲解的&#xf…

C++---类和对象

这里写目录标题 封装简介语法二级目录二级目录二级目录二级目录二级目录二级目录二级目录二级目录二级目录二级目录二级目录二级目录二级目录 封装 简介语法 类 &#xff1a;抽象的 共性的 对象&#xff1a;实例化的 具体的 个性的 封装 就是把属性和行为放在一起 加一些访问权…

CCRC-PIPA个人信息保护评估师

个人信息保护评估师 (Personal InformationProtec-tion Assessor&#xff0c;简称 “PIPA”) 是由中国网络安全审查技术与认证中心(简称CCRC) 推出的面向个人信息保护领域的培训认证。CCRC-PIPA课程以《个人信息保护法》、法规、部门规章、相关国家标准和行业最佳实践为基础&am…