/**
*
给你一个大小为 m x n 的二进制矩阵 grid 。
岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
岛屿的面积是岛上值为 1 的单元格的数目。
计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。
*/
// 淹没与 (i, j) 相邻的陆地,并返回淹没的陆地面积
const dfs = (grid, i, j) => {
let m = grid.length,
n = grid[0].length;
if (i < 0 || j < 0 || i >= m || j >= n) {
// 超出索引边界
return 0;
}
if (grid[i][j] == 0) {
// 已经是海水了
return 0;
}
// 将 (i, j) 变成海水
grid[i][j] = 0;
// 淹没上下左右的陆地
return (
dfs(grid, i + 1, j) + // 上
dfs(grid, i - 1, j) + // 下
dfs(grid, i, j - 1) + // 左
dfs(grid, i, j + 1) + // 右
1
);
};
/**
* @param {number[][]} grid
* @return {number}
*/
var maxAreaOfIsland = function (grid) {
let m = grid.length,
n = grid[0].length;
// 记录岛屿的最大面积
let count = 0;
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (grid[i][j] == 1) {
// 淹没岛屿,并更新最大岛屿面积
count = Math.max(count, dfs(grid, i, j));
}
}
}
return count;
};
// bfs解法
var maxAreaOfIsland = function(grid) {
let ans = 0, row = grid.length, col = grid[0].length;
let dx = [1, -1, 0, 0], dy = [0, 0, 1, -1];
for (let i = 0; i < row; i++) {
for (let j = 0; j < col; j++) {
if (grid[i][j] === 0) continue;
let queue = [[i, j]], curr = 0;
while (queue.length > 0) {
let [x, y] = queue.shift();
if (x < 0 || x >= row || y < 0 || y >= col || grid[x][y] === 0) continue;
++curr;
grid[x][y] = 0;
for (let k = 0; k < dx.length; k++) { // 进行上下左右寻找
queue.push([x + dx[k], y + dy[k]]);
}
}
ans = Math.max(ans, curr);
}
}
return ans;
};
var connect = function(root) {
if (!root) return root
let cur = root
while(cur) {
let dummy = new Node(0)
let pre = dummy
while(cur) {
if (cur.left) {
pre.next = cur.left
pre = pre.next
}
if (cur.right) {
pre.next = cur.right
pre = pre.next
}
cur = cur.next
}
cur = dummy.next
}
return root
const floodFill = (image, sr, sc, newColor) => {
const m = image.length;
const n = image[0].length;
const oldColor = image[sr][sc];
if (oldColor == newColor) return image;
const queue = [[sr, sc]];
while (queue.length) {
const [i, j] = queue.shift();
image[i][j] = newColor;
if (i - 1 >= 0 && image[i - 1][j] == oldColor) queue.push([i - 1, j]);
if (i + 1 < m && image[i + 1][j] == oldColor) queue.push([i + 1, j]);
if (j - 1 >= 0 && image[i][j - 1] == oldColor) queue.push([i, j - 1]);
if (j + 1 < n && image[i][j + 1] == oldColor) queue.push([i, j + 1]);
}
return image;
};