代码随想录| 图论02●695岛屿最大面积 ●1020飞地的数量 ●130被围绕的区域 ●417太平洋大西洋水流问题

news2024/12/29 5:47:46

#695岛屿最大面积

模板题,很快.以下两种dfs,区别是看第一个点放不放到dfs函数中处理,那么初始化的area一个是1一个是0

int dir[4][2]={0,1,0,-1,1,0,-1,0};
    void dfs(int x, int y,int n, int m, int &area,vector<vector<bool>> &v, vector<vector<int>>& grid){
       
        for(int i=0;i<4;i++){
            int nextx=x+dir[i][0];
            int nexty=y+dir[i][1];
            if(nextx<0||nextx>=n||nexty<0||nexty>=m) continue;
            if(!v[nextx][nexty] && grid[nextx][nexty]==1){
                v[nextx][nexty]=true;
                area++;
                dfs(nextx,nexty,n,m,area,v,grid);
            }
        }

    }

    int maxAreaOfIsland(vector<vector<int>>& grid) {
        int n=grid.size();
        int m=grid[0].size();
        vector<vector<bool>> v(n,vector<bool>(m,false));
        int area;
        int max=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(!v[i][j] && grid[i][j]==1){
                    v[i][j]=true;
                    area=1;
                    dfs(i,j,n,m,area,v,grid);
                    max=std::max(max,area);
                }     
            }
        }
        return max;
    }
int dir[4][2]={0,1,0,-1,1,0,-1,0};
    void dfs(int x, int y,int n, int m, int &area,vector<vector<bool>> &v, vector<vector<int>>& grid){
        
        v[x][y]=true;
        area++;
        for(int i=0;i<4;i++){
            int nextx=x+dir[i][0];
            int nexty=y+dir[i][1];
            if(nextx<0||nextx>=n||nexty<0||nexty>=m) continue;
            if(!v[nextx][nexty] && grid[nextx][nexty]==1){
                v[nextx][nexty]=true;
                
                dfs(nextx,nexty,n,m,area,v,grid);
            }
        }

    }

    int maxAreaOfIsland(vector<vector<int>>& grid) {
        int n=grid.size();
        int m=grid[0].size();
        vector<vector<bool>> v(n,vector<bool>(m,false));
        int area;
        int max=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(!v[i][j] && grid[i][j]==1){
                    area=0;
                    dfs(i,j,n,m,area,v,grid);
                    max=std::max(max,area);
                }     
            }
        }
        return max;
    }

 bfs:对应也有两种

int dir[4][2]={0,1,0,-1,1,0,-1,0};
    void bfs(int x, int y,int n, int m, int &area,vector<vector<bool>> &v, vector<vector<int>>& grid){
        queue<pair<int,int>> que;
        que.push({x,y});
        while(!que.empty()){
            auto cur=que.front(); que.pop();
            int curx=cur.first; 
            int cury=cur.second;
            for(int i=0;i<4;i++){
                int nextx=curx+dir[i][0];
                int nexty=cury+dir[i][1];
                if(nextx<0||nextx>=n||nexty<0||nexty>=m) continue;
                if(!v[nextx][nexty] && grid[nextx][nexty]==1){
                    v[nextx][nexty]=true;
                    area++;
                    que.push({nextx,nexty});
                }
            }
        }
    }

    int maxAreaOfIsland(vector<vector<int>>& grid) {
        int n=grid.size();
        int m=grid[0].size();
        vector<vector<bool>> v(n,vector<bool>(m,false));
        int area;
        int max=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(!v[i][j] && grid[i][j]==1){
                    v[i][j]=true;
                    area=1;
                    bfs(i,j,n,m,area,v,grid);
                    max=std::max(max,area);
                }     
            }
        }
        return max;
    }
int dir[4][2]={0,1,0,-1,1,0,-1,0};
    void bfs(int x, int y,int n, int m, int &area,vector<vector<bool>> &v, vector<vector<int>>& grid){
        queue<pair<int,int>> que;
        que.push({x,y});
        v[x][y]=true;
        area++;
        while(!que.empty()){
            auto cur=que.front(); que.pop();
            int curx=cur.first; 
            int cury=cur.second;
            for(int i=0;i<4;i++){
                int nextx=curx+dir[i][0];
                int nexty=cury+dir[i][1];
                if(nextx<0||nextx>=n||nexty<0||nexty>=m) continue;
                if(!v[nextx][nexty] && grid[nextx][nexty]==1){
                    v[nextx][nexty]=true;
                    area++;
                    que.push({nextx,nexty});
                }
            }
        }
    }

    int maxAreaOfIsland(vector<vector<int>>& grid) {
        int n=grid.size();
        int m=grid[0].size();
        vector<vector<bool>> v(n,vector<bool>(m,false));
        int area;
        int max=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(!v[i][j] && grid[i][j]==1){
                    //v[i][j]=true;
                    area=0;
                    bfs(i,j,n,m,area,v,grid);
                    max=std::max(max,area);
                }     
            }
        }
        return max;
    }

#1020飞地的数量

下面是自己写的dfs,过了但是很多可以改进。bfs也差不多这里就不写了 

int dir[4][2]={0,1,0,-1,1,0,-1,0};
    void dfs(int x, int y, vector<vector<int>>& grid, vector<vector<bool>> &v, int &cnt){
        for(int i=0;i<4;i++){
            int nextx=x+dir[i][0];
            int nexty=y+dir[i][1];
            if(nextx<0||nextx>=grid.size()||nexty<0||nexty>=grid[0].size()) continue;
            if(!v[nextx][nexty]&&grid[nextx][nexty]==1){
                v[nextx][nexty]=true;
                cnt++;
                dfs(nextx,nexty,grid,v,cnt);
            }
        }
    }
    
    int numEnclaves(vector<vector<int>>& grid) {
        int n=grid.size();
        int m=grid[0].size();
        vector<vector<bool>> v(n,vector<bool>(m,false));
        int totalcnt=0;
        int cnt=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(grid[i][j]==1) totalcnt++;
            }
        }


        for(int j=0; j<m; j++){
            // Do something with grid[0][j]
             if(!v[0][j]&&grid[0][j]==1){
                    v[0][j]=true;
                    cnt++;
                    dfs(0,j,grid,v,cnt);
                }
        }

        for(int j=0; j<m; j++){
            // Do something with grid[n-1][j]
            if(!v[n-1][j]&&grid[n-1][j]==1){
                    v[n-1][j]=true;
                    cnt++;
                    dfs(n-1,j,grid,v,cnt);
                }
        }

        for(int i=1; i<n-1; i++){
            // Do something with grid[i][0]
            if(!v[i][0]&&grid[i][0]==1){
                    v[i][0]=true;
                    cnt++;
                    dfs(i,0,grid,v,cnt);
                }
        }

        for(int i=1; i<n-1; i++){
            // Do something with grid[i][m-1]
            if(!v[i][m-1]&&grid[i][m-1]==1){
                    v[i][m-1]=true;
                    cnt++;
                    dfs(i,m-1,grid,v,cnt);
                }
        }

        return totalcnt-cnt;

        
    }

可改进的点: 1 其实遍历四周可以四个循环合为两个 

2. 不需要维护一个visited, 直接把遍历过的可以走的陆地变成0海洋 有点巧妙

随想录: 

int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1}; 
    int count; // 统计符合题目要求的陆地空格数量
    void dfs(vector<vector<int>>& grid, int x, int y) {
        grid[x][y] = 0;
        count++;
        for (int i = 0; i < 4; i++) { // 向四个方向遍历
            int nextx = x + dir[i][0];
            int nexty = y + dir[i][1];
            if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;
            if (grid[nextx][nexty] == 0) continue;

            dfs (grid, nextx, nexty);
        }
        return;
    }

public:
    int numEnclaves(vector<vector<int>>& grid) {
        int n = grid.size(), m = grid[0].size();
        // 从左侧边,和右侧边 向中间遍历
        for (int i = 0; i < n; i++) {
            if (grid[i][0] == 1) dfs(grid, i, 0);
            if (grid[i][m - 1] == 1) dfs(grid, i, m - 1);
        }
        // 从上边和下边 向中间遍历
        for (int j = 0; j < m; j++) {
            if (grid[0][j] == 1) dfs(grid, 0, j);
            if (grid[n - 1][j] == 1) dfs(grid, n - 1, j);
        }
        count = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (grid[i][j] == 1) dfs(grid, i, j);
            }
        }
        return count;
    }

#130被围绕的区域

和1020飞地是反过来的。但一开始自己想不到如何只遍历里面的。看来是做不到的,还是要靠先遍历外面。随想录思路用了第三个符号来标记(确实是三种地,内地,外地,海洋),很巧妙

想练习一下bfs,因为比dfs复杂,我总是会出小错误。bfs代码:

自己实现了25min左右吧,感觉代码确实长,东西也多,我还容易出小错误

int dir[4][2]={0,1,0,-1,1,0,-1,0};

    void bfs(int x, int y, vector<vector<char>>& board, char oldc,char newc){
        queue<pair<int,int>> que;
        que.push({x,y});
        board[x][y]=newc;
        while(!que.empty()){
            auto cur=que.front();que.pop();
            int curx=cur.first;
            int cury=cur.second;
            for(int i=0;i<4;i++){
                int nextx=curx+dir[i][0];
                int nexty=cury+dir[i][1];
                if(nextx<0||nextx>=board.size()||nexty<0||nexty>=board[0].size()) continue;
                if(board[nextx][nexty]==oldc){
                    que.push({nextx,nexty});
                    board[nextx][nexty]=newc;
                }
            }
        }
    }

    void solve(vector<vector<char>>& board) {
        int n=board.size();
        int m=board[0].size();

        //itr around land,set A
        for(int j=0;j<m;j++){
            if(board[0][j]=='O') bfs(0,j,board,'O','A');
            if(board[n-1][j]=='O') bfs(n-1,j,board,'O','A');
        }

        for(int i=1;i<n-1;i++){
            if(board[i][0]=='O') bfs(i,0,board,'O','A');
            if(board[i][m-1]=='O') bfs(i,m-1,board,'O','A');
        }

        //go through all, o to x
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(board[i][j]=='O') bfs(i,j,board,'O','X');
            }
        }

        //go through all, A to o
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(board[i][j]=='A') bfs(i,j,board,'A','O');
            }
        }
    }

出错1:忘记检查边界&continue了。记住出现runtime error很有可能就是忘记检查边界了

出错2:多个循环,相互复制,要记得改里面的i,j, char之类的!不要复制了忘记改了呜呜


#417太平洋大西洋水流问题 

有思路,写出来有问题,看了随想录调整的,就过了。弄了四十多分钟

这回基本上都是逻辑思路问题,没有模板问题:

1.我想到了是从边缘逆着流上来。我原来没想到本题是两个visited,都是true就没错。

错的:我额外弄了一个叫top的2d,每次++。但有可能都从pac溜上来的两条路都可以++:

2.我原来很疑惑怎么找到一条路的末尾,其实在这道题不用找。直接两个表都是true的点就是

3. 我没想明白为什么在主函数里,不用判断这些://if(!pac[0][j]),加了也没错但反而慢

int dir[4][2]={0,1,0,-1,1,0,-1,0};
    void dfs(int x, int y,vector<vector<bool>> &v,vector<vector<int>>& vec){
        
        v[x][y]=true;
        for(int i=0;i<4;i++){
            int nextx=x+dir[i][0];
            int nexty=y+dir[i][1];
            if(nextx<0||nextx>=vec.size()||nexty<0||nexty>=vec[0].size()) continue;
            if(!v[nextx][nexty] && vec[nextx][nexty]>=vec[x][y]){
                v[nextx][nexty]=true;
                dfs(nextx,nexty,v,vec);
            }
            
        }
    }

    vector<vector<int>> pacificAtlantic(vector<vector<int>>& vec) {
        int n=vec.size();
        int m=vec[0].size();
        
        vector<vector<bool>> pac(n, vector<bool>(m, false));
        vector<vector<bool>> atl(n, vector<bool>(m, false));
        vector<vector<int>> res;
        
        //left, top
        for(int j=0;j<m;j++){
            //if(!pac[0][j]) dfs(0,j,pac,vec);
            dfs(0,j,pac,vec);
        }
        for(int i=0;i<n;i++){
            //if(!pac[i][0]) dfs(i,0,pac,vec);
            dfs(i,0,pac,vec);
        }

        //right bottom
        for(int j=0;j<m;j++){
            //if(!atl[n-1][j]) dfs(n-1,j,atl,vec);
            dfs(n-1,j,atl,vec);
        }
        for(int i=0;i<n;i++){
            //if(!atl[i][m-1]) dfs(i,m-1,atl,vec);
            dfs(i,m-1,atl,vec);
        }

        //check res
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(pac[i][j]&&atl[i][j]){
                    res.push_back({i,j});
                }
            }
        }
        return res;
    }

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

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

相关文章

HTML入门教程||HTML 属性||HTML 元素

HTML 元素 HTML 元素 HTML 文档由 HTML 元素定义&#xff0c;HTML 元素指的是从开始标签&#xff08;start tag&#xff09;到结束标签&#xff08;end tag&#xff09;的所有代码。 HTML 元素 开始标签 *元素内容结束标签 *<p>这是一个段落</p><a href"…

《Docker和服务器无状态化:容器化应用的优势,构建高可伸缩性和灵活性》

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

【MATLAB第58期】基于MATLAB的PCA-Kmeans、PCA-LVQ与BP神经网络分类预测模型对比

【MATLAB第58期】基于MATLAB的PCA-Kmeans、PCA-LVQ与BP神经网络分类预测模型对比 一、数据介绍 基于UCI葡萄酒数据集进行葡萄酒分类及产地预测 共包含178组样本数据&#xff0c;来源于三个葡萄酒产地&#xff0c;每组数据包含产地标签及13种化学元素含量&#xff0c;即已知类…

c++高性能264/265实时流媒体服务器/h5客户端整体解决方案源码

文章目录 c高性能264/265实时流媒体服务器/h5客户端整体解决方案源码缘由目前的前端技术栈&#xff0c;已经能够支撑常规的安防桌面客户端软件开发我的方案一套c后端,两套前端H5 UI方案一&#xff1a;多屏h265/h264混合显示H5 UI方案二&#xff1a;H5监控大屏,提供视图切换功能…

基于SRS后端开发的前端页面

SRS(Simple Realtime Server)是简单高效的实时视频服务器&#xff0c;支持RTMP、WebRTC、HLS、HTTP-FLV、SRT等多种实时流媒体协议。 框架 https://www.thinkphp.cn 官网 https://ossrs.net/lts/zh-cn 播放器1 https://www.cdnbye.com 播放器2 https://www.artplayer.org …

苹果的Apple GPT要来了?

据外媒消息&#xff0c;苹果正在内部开发类 ChatGPT 的产品&#xff0c;与微软、OpenAI、谷歌、Meta 等科技巨头在生成式 AI 赛道展开竞争。该消息使得苹果股价上涨了 2%。据苹果工程师透露&#xff0c;苹果在内部构建了代号为“Ajax”的大语言模型开发框架&#xff0c;并构建了…

【C语言】表达式求值相关问题汇总—>隐式类型转换(整型提升)、算数转换与操作符优先级汇总(收藏查阅)

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负。 目录 前言&#xff1a; 一、隐式类型转换 &#xff08;一&#xff09;整型提升的意义…

【六天】高时空分辨率、高精度一体化预测技术之风、光、水能源自动化预测技术应用

最初的互补发电系统&#xff0c;就是将不同发点组件进行简单的组合&#xff0c;因为缺乏详细的数学计算模型&#xff0c;同时系统只用于保证率低的用户&#xff0c;导致使用寿命不长。随着新能源系统应用范围的不断扩大&#xff0c;保证率和经济性要求的提高&#xff0c;需要高…

Rust vs Go:常用语法对比(四)

题图来自 Go vs. Rust performance comparison: The basics 61. Get current date 获取当前时间 package mainimport ( "fmt" "time")func main() { d : time.Now() fmt.Println("Now is", d) // The Playground has a special sandbox, so you …

【力扣周赛】第 354 场双周赛

文章目录 Q1&#xff1a;2784. 检查数组是否是好的解法1——排序模拟判断解法2——哈希表计数模拟判断 Q2&#xff1a;6926. 将字符串中的元音字母排序Q3&#xff1a;6931. 访问数组中的位置使分数最大&#xff08;线性DP&#xff09;Q4&#xff1a;6922. 将一个数字表示成幂的…

什么是神经网络?

我们常常使用深度学习来指训练神经网络的过程。 在这里举一个房屋价格预测的例子&#xff1a;假设有一个数据集&#xff0c;它包含了六栋房子的信息。所以&#xff0c;你知道房屋的面积是多少平方米&#xff0c;并且知道这个房屋的价格。这是&#xff0c;你想要拟合一个根据房屋…

【Linux】linux工具和命令

这里写目录标题 一、Linux常用命令&#xff1a;二、Linux安装软件&#xff1a;1.yum安装2.Linux和Windows文件互传3.yum卸载软件 三、vim编辑器1.命令模式2.vim配置项说明3.vim操作总结 一、Linux常用命令&#xff1a; ls 显示当前目录下的文件 ls-a 显示当前目录下所有文件&a…

自定义类型:结构体进阶学习分享

自定义类型&#xff1a;结构体进阶学习分享 前言1 结构体的基础知识2 结构的声明3 特殊声明4 结构的自引用5 结构体变量的定义和初始化6 结构体内存对齐6.1 计算结构体大小相关笔试题&#xff08;基于VS&#xff09;笔试题一&#xff1a;笔试题二&#xff1a; 6.2 为什么存在内…

【C语言】指针进阶(1)

在前期的文章中&#xff0c;我们已经学习完了指针初阶的内容&#xff0c;这期我们开始学习指针的进阶部分。 指针初阶文章入口&#xff1a; 指针初阶 目录 重点知识概览 前期回顾 字符指针 指针数组 数组指针 数组指针的定义 &数组名VS数组名 数组指针的使用 数组…

Mac电脑文件夹无权限问题

sudo cp 16.5.zip /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport 走到之前的folder &#xff0c;右键选择get info更改權限, 再應用到所有子文件夹 右下解鎖再加自己Read & Write, -右邊拉下應該可以應用到所有子文件 这样就可以…

Java ~ Executor ~ ExecutorCompletionService【总结】

前言 文章 相关系列&#xff1a;《Java ~ Executor【目录】》&#xff08;持续更新&#xff09;相关系列&#xff1a;《Java ~ Executor ~ ExecutorCompletionService【源码】》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;相关系列&#xff1a;《Java ~ Exe…

如何做需求分析

目录 核心理念&#xff1a; 主要目的&#xff1a; 具体思路&#xff1a; 注意事项&#xff1a; 核心理念&#xff1a; 首先需要想清楚一个问题&#xff1a;作为一个测试&#xff0c;有没有把需求当作产品中的一个组成部分&#xff0c;然后尽到一个测试的责任与义务&#x…

JavaScript中truthy(真值)或者Falsy(假值)

● 在JavaScript中&#xff0c;有五个值是falsy ○ 0 ○ ’ ’ ○ undefined ○ null ○ NaN 除此之外&#xff0c;任何不是空值的都是真值&#xff1b; 假值是什么意思呢&#xff1f;就是转换为布尔值都是false&#xff0c;反则就是true 例如&#xff1a; console.log(Boole…

论文阅读:矩阵乘法GEMM的cache优化,子矩阵的切分方法Anatomy of High-Performance MatrixMultiplication

矩阵乘法优化的知名论文goto paper&#xff1a; 矩阵乘法的优化需要将矩阵切分成子矩阵&#xff0c;用子矩阵相乘的结果组合为原矩阵相乘的结果&#xff1a; 上图是拆分矩阵的方法&#xff0c;M表示矩阵&#xff0c;X方向和Y方向的两个维度都是未知的。P表示横条或竖条&#x…

微信小程序使用ECharts的示例详解

目录 安装 ECharts 组件使用 ECharts 组件图表延迟加载 echarts-for-weixin 是 ECharts 官方维护的一个开源项目&#xff0c;提供了一个微信小程序组件&#xff08;Component&#xff09;&#xff0c;我们可以通过这个组件在微信小程序中使用 ECharts 绘制图表。 echarts-fo…