【LeetCode每日一题】1034. 边界着色【中等】DFS/BFS

给你一个大小为 m x n 的整数矩阵 grid ,表示一个网格。另给你三个整数 row、col 和 color 。网格中的每个值表示该位置处的网格块的颜色。

两个网格块属于同一 连通分量 需满足下述全部条件:

两个网格块颜色相同 在上、下、左、右任意一个方向上相邻 连通分量的边界 是指连通分量中满足下述条件之一的所有网格块:

在上、下、左、右四个方向上与不属于同一连通分量的网格块相邻 在网格的边界上(第一行/列或最后一行/列) 请你使用指定颜色 color 为所有包含网格块 grid[row][col] 的 连通分量的边界 进行着色,并返回最终的网格 grid 。

 

示例 1:

输入:grid = [[1,1],[1,2]], row = 0, col = 0, color = 3 输出:[[3,3],[3,2]] 示例 2:

输入:grid = [[1,2,2],[2,3,2]], row = 0, col = 1, color = 3 输出:[[1,3,3],[2,3,3]] 示例 3:

输入:grid = [[1,1,1],[1,1,1],[1,1,1]], row = 1, col = 1, color = 2 输出:[[2,2,2],[2,1,2],[2,2,2]]  

提示:

m == grid.length n == grid[i].length 1 <= m, n <= 50 1 <= grid[i][j], color <= 1000 0 <= row < m 0 <= col < n

题解: 这个题目稍稍有点难读懂,大致意思就是找到相同颜色的边边,然后给边边换个颜色, 里面颜色不变。 我用了一个BFS的写法,开了好多数组,写得有点丑。

class Solution {
public:
    vector<vector<int>> colorBorder(vector<vector<int>>& grid, int row, int col, int color) {
        int m = grid.size();
        int n = grid[0].size();
        queue<pair<int, int>> q;
        map<pair<int, int>, bool> fin;
        map<pair<int, int>, bool> vis;
        q.push({row, col});
        vis[{row, col}] = true;
        int initcolor = grid[row][col];
        vector<vector<int>> d = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};
        while(!q.empty()){
            auto now = q.front();
            q.pop();
            int x = now.first;
            int y = now.second;
            //cout<<"x:"<<x<<" y:"<<y<<endl;
            //记一下周围是不是都是相同颜色,是的话不是边边
            int cnt = 0;
            for(int i = 0; i < 4; i++){
                int dx = x + d[i][0];
                int dy = y + d[i][1];
                if(dx >= 0 && dx < m && dy >= 0 && dy < n && grid[dx][dy] == initcolor){
                    cnt++;
                    if(!vis[{dx, dy}]){
                        //cout<<"dx:"<<dx<<" dy:"<<dy<<endl;
                        q.push({dx, dy});
                        vis[{dx, dy}] = true;
                    }
                }
            }
            if(cnt != 4) fin[{x, y}] = true;
        }
        vector<vector<int>> ans(m, vector<int>(n));
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                if(fin[{i, j}]){
                    ans[i][j] = color;
                }
                else{
                    ans[i][j] = grid[i][j];
                }
            }
        }
        return ans;
    }
};

附一个DFS的写法

typedef pair<int, int> pii;

class Solution {
public:
    vector<vector<int>> colorBorder(vector<vector<int>>& grid, int row, int col, int color) {
        int m = grid.size(), n = grid[0].size();
        vector<vector<bool>> visited(m, vector<bool>(n, false));
        vector<pii> borders;
        int originalColor = grid[row][col];
        visited[row][col] = true;
        dfs(grid, row, col, visited, borders, originalColor);
        for (auto & [x, y] : borders) {
            grid[x][y] = color;
        }
        return grid;
    }

    void dfs(vector<vector<int>>& grid, int x, int y, vector<vector<bool>> & visited, vector<pii> & borders, int originalColor) {
        int m = grid.size(), n = grid[0].size();
        bool isBorder = false;
        int direc[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
        for (int i = 0; i < 4; i++) {
            int nx = direc[i][0] + x, ny = direc[i][1] + y;
            if (!(nx >= 0 && nx < m && ny >= 0 && ny < n && grid[nx][ny] == originalColor)) {
                isBorder = true;
            } else if (!visited[nx][ny]) {
                visited[nx][ny] = true;
                dfs(grid, nx, ny, visited, borders, originalColor);
            }                
        }
        if (isBorder) {
            borders.emplace_back(x, y);
        }
    }
};
全部评论

相关推荐

昨天 10:54
华南理工大学
昨天收到腾讯音乐OC了,xdm,准备去做TME孝子了!正式宣布:TME,你的兵来了!BG:本硕都是华南理工软件工程专业,有腾讯CSIG和字节的两段实习,还有一篇A区论文一作在投。OC的是酷狗的后台开发。不为别的,就为这第一个OC,想哭!流程里还有团子和鹅,上周被阿里一轮游了……脆皮大学生表示:淘宝已卸载,谢谢。广州人,就想找个离家近的厂,当然也有自己的一些考虑,放在最后,兄弟们要是没有精力海投或者最后要抉择Offer,可以参考我的逻辑。TL:3.14网申-3.17一面-3.19二面-3.21&nbsp;hr面-3.24OC。TME没有笔试,我就面试的时候手撕了一轮,所以感觉流程推进很快,刚好10天,顺利...
都有实习了:10天速通?恭喜大佬,而且真的好厉害 但是有一个***********************诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖哈哈)
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务