Leetcode学习计划-算法入门第7天

Leetcode学习计划-算法入门第7天

主题是广度优先搜索

题目733:有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。

给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 newColor,让你重新上色这幅图像。

为了完成上色工作,从初始坐标开始,记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应四个方向上像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为新的颜色值。

最后返回经过上色渲染后的图像。

方案:广度优先搜索,固定格式。

class Solution {
public:
    const int r[4]={1,-1,0,0};
    const int c[4]={0,0,1,-1};
    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {
        int oldcolor=image[sr][sc];
        if(oldcolor==newColor)return image;
        int n=image.size();
        int m=image[0].size();
        queue<pair<int,int>>que;
        que.push(pair<int,int>(sr,sc));
        while(!que.empty()){
            int tempr=que.front().first;
            int tempc=que.front().second;
            image[tempr][tempc]=newColor;
            que.pop();
            for(int i=0;i<4;i++){
                int mx=tempr+r[i],my=tempc+c[i];
                if(mx>=0&&mx<n&&my>=0&&my<m&&image[mx][my]==oldcolor){
                    que.emplace(mx,my);
                }
               
            }
        }
        return image;
    }
};

题目695:给你一个大小为 m x n 的二进制矩阵 grid 。

岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
岛屿的面积是岛上值为 1 的单元格的数目。
计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。

方案:把上一道题的成果应用到这里,上一道题解决的问题是从一个格子出发向上下左右方向所能覆盖的最大面积,这道题中可能存在多个岛屿,相当于把每个岛屿做一次最大面积的计算,最终所有岛屿面积的最大值即为所求结果。

class Solution {
public:
    const int r[4]={1,-1,0,0};
    const int c[4]={0,0,1,-1};

    //计算一个岛屿的面积
    int bfs(vector<vector<int>>& grid,int sr,int sc){
        queue<pair<int,int>>que;
        que.emplace(sr,sc);
        int m=grid.size();
        int n=grid[0].size();
        grid[sr][sc]=0;
        int cnt=0;
        while(!que.empty()){
            int x=que.front().first,y=que.front().second;
            que.pop();
            cnt++;
            for(int i=0;i<4;i++){
                int mx=x+r[i],my=y+c[i];
                if(mx>=0&&mx<m&&my>=0&&my<n&&grid[mx][my]==1){
                    que.emplace(mx,my);
                    grid[mx][my]=0; //找到后变为0
                }
            }
        }
        return cnt;
    }
    
    int maxAreaOfIsland(vector<vector<int>>& grid) {
        int ans=0;
        int m=grid.size();
        int n=grid[0].size();
        //循环找到所有岛屿
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(grid[i][j]==1){
                    int cn=bfs(grid,i,j);
                    ans=max(ans,cn);
                }
            }
        }
        return ans;
    }
};

来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值