695.岛屿的最大面积、733.图像渲染

This commit is contained in:
游由 2021-11-18 09:26:14 +08:00
parent 352bb7307a
commit 5c2f228b54
3 changed files with 163 additions and 0 deletions

View File

@ -77,7 +77,9 @@ mod q0598;
mod q0617;
mod q0633;
mod q0690;
mod q0695;
mod q0704;
mod q0733;
mod q0740;
mod q0746;
mod q0781;

View File

@ -0,0 +1,88 @@
use crate::Solution;
impl Solution {
/// [695.岛屿的最大面积](https://leetcode-cn.com/problems/max-area-of-island/)
///
/// 2021-11-17 13:12:58
///
/// 给你一个大小为 `m x n` 的二进制矩阵 `grid` 。
///
/// **岛屿** 是由一些相邻的 `1` \(代表土地\) 构成的组合,这里的「相邻」要求两个 `1` 必须在 **水平或者竖直的四个方向上** 相邻。你可以假设 `grid` 的四个边缘都被 `0`(代表水)包围着。
///
/// 岛屿的面积是岛上值为 `1` 的单元格的数目。
///
/// 计算并返回 `grid` 中最大的岛屿面积。如果没有岛屿,则返回面积为 `0` 。
///
/// * **示例 1**
/// + ![](https://assets.leetcode.com/uploads/2021/05/01/maxarea1-grid.jpg)
/// + **输入:** grid = \[\[0,0,1,0,0,0,0,1,0,0,0,0,0\],\[0,0,0,0,0,0,0,1,1,1,0,0,0\],\[0,1,1,0,1,0,0,0,0,0,0,0,0\],\[0,1,0,0,1,1,0,0,1,0,1,0,0\],\[0,1,0,0,1,1,0,0,1,1,1,0,0\],\[0,0,0,0,0,0,0,0,0,0,1,0,0\],\[0,0,0,0,0,0,0,1,1,1,0,0,0\],\[0,0,0,0,0,0,0,1,1,0,0,0,0\]\]
/// + **输出:** 6
/// + **解释:** 答案不应该是 `11` ,因为岛屿只能包含水平或垂直这四个方向上的 `1` 。
/// * **示例 2**
/// + **输入:** grid = \[\[0,0,0,0,0,0,0,0\]\]
/// + **输出:** 0
/// * **提示:**
/// * `m == grid.length`
/// * `n == grid[i].length`
/// * `1 <= m, n <= 50`
/// * `grid[i][j]` 为 `0` 或 `1`
/// * Related Topics
/// + 深度优先搜索
/// + 广度优先搜索
/// + 并查集
/// + 数组
/// + 矩阵
/// * 👍 595
/// * 👎 0
pub fn max_area_of_island(mut grid: Vec<Vec<i32>>) -> i32 {
fn dfs(grid: &mut Vec<Vec<i32>>, i: usize, j: usize) -> i32 {
if grid[i][j] == 0 {
return 0;
}
grid[i][j] = 0;
let mut ans = 1;
if i > 0 {
ans += dfs(grid, i - 1, j);
}
if i < grid.len() - 1 {
ans += dfs(grid, i + 1, j);
}
if j > 0 {
ans += dfs(grid, i, j - 1);
}
if j < grid[0].len() - 1 {
ans += dfs(grid, i, j + 1);
}
ans
}
let mut ans = 0;
for i in 0..grid.len() {
for j in 0..grid[i].len() {
ans = ans.max(dfs(&mut grid, i, j));
}
}
ans
}
}
#[cfg(test)]
mod test {
use crate::Solution;
#[test]
fn test_q0695() {
let grid = vec![
vec![0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
vec![0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0],
vec![0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
vec![0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0],
vec![0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0],
vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
vec![0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0],
vec![0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0],
];
assert_eq!(Solution::max_area_of_island(grid), 6);
}
}

View File

@ -0,0 +1,73 @@
use crate::Solution;
impl Solution {
/// [733.图像渲染](https://leetcode-cn.com/problems/flood-fill/)
///
/// 2021-11-17 13:08:59
///
/// 有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。
///
/// 给你一个坐标 `(sr, sc)` 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 `newColor`,让你重新上色这幅图像。
///
/// 为了完成上色工作,从初始坐标开始,记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应四个方向上像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为新的颜色值。
///
/// 最后返回经过上色渲染后的图像。
///
/// * **示例 1:**
/// + **输入:**
/// - image = \[\[1,1,1\],\[1,1,0\],\[1,0,1\]\]
/// - sr = 1, sc = 1, newColor = 2
/// + **输出:** \[\[2,2,2\],\[2,2,0\],\[2,0,1\]\]
/// + **解析:**
/// - 在图像的正中间,\(坐标\(sr,sc\)=\(1,1\)\),
/// - 在路径上所有符合条件的像素点的颜色都被更改成2。
/// - 注意右下角的像素没有更改为2
/// - 因为它不是在上下左右四个方向上与初始点相连的像素点。
/// * **注意:**
/// * `image` 和 `image[0]` 的长度在范围 `[1, 50]` 内。
/// * 给出的初始点将满足 `0 <= sr < image.length` 和 `0 <= sc < image[0].length`。
/// * `image[i][j]` 和 `newColor` 表示的颜色值在范围 `[0, 65535]`内。
/// * Related Topics
/// + 深度优先搜索
/// + 广度优先搜索
/// + 数组
/// + 矩阵
/// * 👍 237
/// * 👎 0
pub fn flood_fill(mut image: Vec<Vec<i32>>, sr: i32, sc: i32, new_color: i32) -> Vec<Vec<i32>> {
fn dfs(image: &mut Vec<Vec<i32>>, sr: usize, sc: usize, new_color: i32) {
image[sr][sc] |= 0x10000;
if sr > 0 && image[sr][sc] ^ image[sr - 1][sc] == 0x10000 {
dfs(image, sr - 1, sc, new_color);
}
if sr < image.len() - 1 && image[sr][sc] ^ image[sr + 1][sc] == 0x10000 {
dfs(image, sr + 1, sc, new_color);
}
if sc > 0 && image[sr][sc] ^ image[sr][sc - 1] == 0x10000 {
dfs(image, sr, sc - 1, new_color);
}
if sc < image[0].len() - 1 && image[sr][sc] ^ image[sr][sc + 1] == 0x10000 {
dfs(image, sr, sc + 1, new_color);
}
image[sr][sc] = new_color;
}
if image[sr as usize][sc as usize] != new_color {
dfs(&mut image, sr as usize, sc as usize, new_color);
}
image
}
}
#[cfg(test)]
mod test {
use crate::Solution;
#[test]
fn test_q0733() {
let image = vec![vec![1, 1, 1], vec![1, 1, 0], vec![1, 0, 1]];
let fill = Solution::flood_fill(image, 1, 1, 2);
assert_eq!(fill, vec![vec![2, 2, 2], vec![2, 2, 0], vec![2, 0, 1]]);
}
}