【我也想刷穿 LeetCode】1034. 边界着色

92 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

现在前端很多岗位面试需要有一定的算法基础,或者说经常刷算法的会优先考虑。

因此每天刷刷LeetCode非常有必要

在这之前我也刷过一些算法题,也希望以后也坚持刷,跟某掘友一样,我也想刷穿 LeetCode

一、题目描述

给你一个大小为 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]]

二、思路分析

笨比dfs..

有一个点wa了一次 如果当前颜色是染过的颜色 那认为它不是边,这很正常.. 但是,可能你当前遍历的颜色就是你要染的颜色,这时候它又是边了

所以 染色直接用某个字符替代一下 最后统一处理.. 用来解决这个点

三、代码实现

/**
 * @param {number[][]} grid
 * @param {number} row
 * @param {number} col
 * @param {number} color
 * @return {number[][]}
 */
var colorBorder = function(grid, row, col, color) {
    function dfs(x, y, value) {
        if (x < 0 || x >= grid.length || y < 0 || y >= grid[0].length) return true;
        if (grid[x][y] == '*' || grid[x][y] == '-') return false;

        if (grid[x][y] == value) {
            grid[x][y] = '*';

            let t = dfs(x - 1, y, value);
            let b = dfs(x + 1, y, value);
            let l = dfs(x, y - 1, value);
            let r = dfs(x, y + 1, value);

            // 是个边
            if (t || b || l || r) {
                grid[x][y] = '-';
            }
            return false;
        } else {
            return true;
        }
    }
    let tmp = grid[row][col];
    dfs(row, col, tmp);
    for (let i = 0; i < grid.length; i++) {
        for (let j = 0; j < grid[i].length; j++) {
            if (grid[i][j] == '*') {
                grid[i][j] = tmp;
            } else if (grid[i][j] == '-') {
                grid[i][j] = color;
            }
        }
    }
    return grid;
};

四、总结

以上就是本道题的所有内容了,本系列会持续更,欢迎点赞、关注、收藏,另外如有其他的问题,欢迎下方留言给我,我会第一时间回复你,感谢~