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;
};
四、总结
以上就是本道题的所有内容了,本系列会持续更,欢迎点赞、关注、收藏,另外如有其他的问题,欢迎下方留言给我,我会第一时间回复你,感谢~