2023-05-07:给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。 返回执行此操作后,grid 中最大的岛屿面积是多少? 岛屿 由一组上、下、左、右四个方向相
2023-05-07:给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。
返回执行此操作后,grid 中最大的岛屿面积是多少?
岛屿 由一组上、下、左、右四个方向相连的 1 形成。
输入: grid = [[1, 0], [0, 1]]。
输出: 3。
来自亚马逊、谷歌、微软、Facebook、Bloomberg。
答案2023-05-07:
算法步骤:
1.遍历输入矩阵 grid,对于每个岛屿进行标记,并用数组 sizes 统计每个岛屿的大小。
2.遍历矩阵 grid,对于每个位置上的值,如果当前位置上的值为非零正整数,则更新答案为当前岛屿的大小。
3.遍历矩阵 grid,当当前位置上的值为 0 时,分别查看该位置上、下、左、右四个方向是否有与其相邻且已经被访问过的岛屿,并将它们的大小累加起来。如果这些岛屿的大小之和加上当前位置上自身的大小可以更新最大岛屿面积,则更新答案。
4.返回答案。
时间复杂度:$O(n^2)$ ,遍历了三次矩阵,每次遍历的时间复杂度均为 $O(n^2)$。
空间复杂度:$O(n^2)$,使用了两个二维数组,每个数组都是 $n \times n$ 的大小。
go完整代码如下:
package main
import "fmt"
func main() {
grid := [][]int{{1, 0}, {0, 1}}
ans := largestIsland(grid)
fmt.Println(ans)
}
func largestIsland(grid [][]int) int {
n := len(grid)
m := len(grid[0])
id := 2
for i := 0; i < n; i++ {
for j := 0; j < m; j++ {
if grid[i][j] == 1 {
infect(grid, i, j, id, n, m)
id++
}
}
}
sizes := make([]int, id)
ans := 0
for i := 0; i < n; i++ {
for j := 0; j < m; j++ {
if grid[i][j] > 1 {
sizes[grid[i][j]]++
ans = max(ans, sizes[grid[i][j]])
}
}
}
visited := make([]bool, id)
for i := 0; i < n; i++ {
for j := 0; j < m; j++ {
if grid[i][j] == 0 {
up := 0
if i-1 >= 0 {
up = grid[i-1][j]
}
down := 0
if i+1 < n {
down = grid[i+1][j]
}
left := 0
if j-1 >= 0 {
left = grid[i][j-1]
}
right := 0
if j+1 < m {
right = grid[i][j+1]
}
merge := 1 + sizes[up]
visited[up] = true
if !visited[down] {
merge += sizes[down]
visited[down] = true
}
if !visited[left] {
merge += sizes[left]
visited[left] = true
}
if !visited[right] {
merge += sizes[right]
visited[right] = true
}
ans = max(ans, merge)
visited[up] = false
visited[down] = false
visited[left] = false
visited[right] = false
}
}
}
return ans
}
func infect(grid [][]int, i, j, v, n, m int) {
if i < 0 || i == n || j < 0 || j == m || grid[i][j] != 1 {
return
}
grid[i][j] = v
infect(grid, i-1, j, v, n, m)
infect(grid, i+1, j, v, n, m)
infect(grid, i, j-1, v, n, m)
infect(grid, i, j+1, v, n, m)
}
func max(a, b int) int {
if a > b {
return a
}
return b
}

rust完整代码如下:
fn main() {
let grid = vec![vec![1, 0], vec![0, 1]];
let ans = largest_island(grid);
println!("{}", ans);
}
fn largest_island(grid: Vec<Vec<i32>>) -> i32 {
let n = grid.len();
let m = grid[0].len();
let mut id = 2;
let mut new_grid = grid.clone();
for i in 0..n {
for j in 0..m {
if new_grid[i][j] == 1 {
infect(&mut new_grid, i as i32, j as i32, id, n as i32, m as i32);
id += 1;
}
}
}
let mut sizes = vec![0; id as usize];
let mut ans = 0;
for i in 0..n {
for j in 0..m {
if new_grid[i][j] > 1 {
sizes[new_grid[i][j] as usize] += 1;
ans = ans.max(sizes[new_grid[i][j] as usize]);
}
}
}
let mut visited = vec![false; id as usize];
for i in 0..n {
for j in 0..m {
if new_grid[i][j] == 0 {
let up = if i > 0 { new_grid[i - 1][j] } else { 0 };
let down = if i < n - 1 { new_grid[i + 1][j] } else { 0 };
let left = if j > 0 { new_grid[i][j - 1] } else { 0 };
let right = if j < m - 1 { new_grid[i][j + 1] } else { 0 };
let mut merge = 1;
if up > 0 && !visited[up as usize] {
visited[up as usize] = true;
merge += sizes[up as usize];
}
if down > 0 && !visited[down as usize] {
visited[down as usize] = true;
merge += sizes[down as usize];
}
if left > 0 && !visited[left as usize] {
visited[left as usize] = true;
merge += sizes[left as usize];
}
if right > 0 && !visited[right as usize] {
visited[right as usize] = true;
merge += sizes[right as usize];
}
ans = ans.max(merge);
visited[up as usize] = false;
visited[down as usize] = false;
visited[left as usize] = false;
visited[right as usize] = false;
}
}
}
ans
}
fn infect(grid: &mut Vec<Vec<i32>>, i: i32, j: i32, v: i32, n: i32, m: i32) {
if i < 0 || i == n || j < 0 || j == m || grid[i as usize][j as usize] != 1 {
return;
}
grid[i as usize][j as usize] = v;
infect(grid, i - 1, j, v, n, m);
infect(grid, i + 1, j, v, n, m);
infect(grid, i, j - 1, v, n, m);
infect(grid, i, j + 1, v, n, m);
}

c完整代码如下:
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#define MAX_SIZE 50
void infect(int grid[][MAX_SIZE], int i, int j, int v, int n, int m);
int largestIsland(int grid[][MAX_SIZE], int n, int m);
int main() {
int grid[][MAX_SIZE] = { {1, 0}, {0, 1} };
int n = 2;
int m = 2;
int ans = largestIsland(grid, n, m);
printf("%d\n", ans); // 输出 3
return 0;
}
int largestIsland(int grid[][MAX_SIZE], int n, int m) {
int id = 2;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j] == 1) {
infect(grid, i, j, id++, n, m);
}
}
}
int sizes[MAX_SIZE * MAX_SIZE];
memset(sizes, 0, sizeof(sizes));
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j] > 1) {
ans = ans > ++sizes[grid[i][j]] ? ans : sizes[grid[i][j]];
}
}
}
bool visited[MAX_SIZE * MAX_SIZE] = { false };
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j] == 0) {
int up = i - 1 >= 0 ? grid[i - 1][j] : 0;
int down = i + 1 < n ? grid[i + 1][j] : 0;
int left = j - 1 >= 0 ? grid[i][j - 1] : 0;
int right = j + 1 < m ? grid[i][j + 1] : 0;
int merge = 1 + sizes[up];
visited[up] = true;
if (!visited[down]) {
merge += sizes[down];
visited[down] = true;
}
if (!visited[left]) {
merge += sizes[left];
visited[left] = true;
}
if (!visited[right]) {
merge += sizes[right];
visited[right] = true;
}
ans = ans > merge ? ans : merge;
visited[up] = false;
visited[down] = false;
visited[left] = false;
visited[right] = false;
}
}
}
return ans;
}
void infect(int grid[][MAX_SIZE], int i, int j, int v, int n, int m) {
if (i < 0 || i == n || j < 0 || j == m || grid[i][j] != 1) {
return;
}
grid[i][j] = v;
infect(grid, i - 1, j, v, n, m);
infect(grid, i + 1, j, v, n, m);
infect(grid, i, j - 1, v, n, m);
infect(grid, i, j + 1, v, n, m);
}

c++完整代码如下:
#include <iostream>
#include <cstring>
#define MAX_SIZE 50
using namespace std;
void infect(int grid[][MAX_SIZE], int i, int j, int v, int n, int m);
int largestIsland(int grid[][MAX_SIZE], int n, int m);
int main() {
int grid[][MAX_SIZE] = { {1, 0}, {0, 1} };
int n = 2;
int m = 2;
int ans = largestIsland(grid, n, m);
cout << ans << endl;
return 0;
}
int largestIsland(int grid[][MAX_SIZE], int n, int m) {
int id = 2;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j] == 1) {
infect(grid, i, j, id++, n, m);
}
}
}
int sizes[MAX_SIZE * MAX_SIZE];
memset(sizes, 0, sizeof(sizes)); // 初始化为0
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j] > 1) {
ans = max(ans, ++sizes[grid[i][j]]);
}
}
}
bool visited[MAX_SIZE * MAX_SIZE] = { false }; // 初始化为false
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j] == 0) {
int up = i - 1 >= 0 ? grid[i - 1][j] : 0;
int down = i + 1 < n ? grid[i + 1][j] : 0;
int left = j - 1 >= 0 ? grid[i][j - 1] : 0;
int right = j + 1 < m ? grid[i][j + 1] : 0;
int merge = 1 + sizes[up];
visited[up] = true;
if (!visited[down]) {
merge += sizes[down];
visited[down] = true;
}
if (!visited[left]) {
merge += sizes[left];
visited[left] = true;
}
if (!visited[right]) {
merge += sizes[right];
visited[right] = true;
}
ans = max(ans, merge);
visited[up] = false;
visited[down] = false;
visited[left] = false;
visited[right] = false;
}
}
}
return ans;
}
void infect(int grid[][MAX_SIZE], int i, int j, int v, int n, int m) {
if (i < 0 || i == n || j < 0 || j == m || grid[i][j] != 1) {
return;
}
grid[i][j] = v;
infect(grid, i - 1, j, v, n, m);
infect(grid, i + 1, j, v, n, m);
infect(grid, i, j - 1, v, n, m);
infect(grid, i, j + 1, v, n, m);
}

2023-05-07:给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。 返回执行此操作后,grid 中最大的岛屿面积是多少? 岛屿 由一组上、下、左、右四个方向相的更多相关文章
- js实现Mac触摸板双指事件(上/下/左/右/放大/缩小)
前言 这几天在修复一个web问题时,需要捕获Mac触摸板双指事件(上.下.左.右.放大.缩小),但发现并没有现成的轮子,还是要自己造. 例如:jquery.mousewheel.js(添加跨浏览器的鼠 ...
- 在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。
//在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’:输出这个数组中的所有元素. char [][]y=new char [10][10 ...
- 在主方法中定义一个大小为50的一维整型数组,数组i名为x,数组中存放着{1,3,5,…,99}输出这个数组中的所有元素,每输出十个换一行
package hanqi; import java.util.Scanner; public class Test7 { public static void main(String[] args) ...
- 一个大小为N的数组,里面是N个整数,怎样去除重复的数
题目:一个大小为N的数组,里面是N个整数,怎样去除重复的数字: 要求时间复杂度为O(n),空间复杂度为O(1). 需要除掉重复的整数的数组,注意这里我没有处理负数情况,其实负数情况只要先用0快排分一下 ...
- 假设一个大小为100亿个数据的数组,该数组是从小到大排好序的,现在该数组分成若干段,每个段的数据长度小于20「也就是说:题目并没有说每段数据的size 相同,只是说每个段的 size < 20 而已」
假设一个大小为100亿个数据的数组,该数组是从小到大排好序的,现在该数组分成若干段,每个段的数据长度小于20「也就是说:题目并没有说每段数据的size 相同,只是说每个段的 size < 20 ...
- C用malloc 向系统申请一个大小为n*4个字节的内存块
#include <stdio.h> #include <malloc.h> void out(int *p, int n){ int i; for(i=0;i<n;i+ ...
- 16.按要求编写Java应用程序。 编写一个名为Test的主类,类中只有一个主方法; 在主方法中定义一个大小为50的一维整型数组,数组名为x,数组中存放着{1, 3,5,…,99}输出这个数组中的所有元素,每输出十个换一行;在主方法中定义一 个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。
//分类 package com.bao; public class Shuchu { int[]yi=new int[50]; String[][]er=new String[10][10]; vo ...
- 按要求编写Java应用程序。 编写一个名为Test的主类,类中只有一个主方法; 在主方法中定义一个大小为50的一维整型数组,数组名为x,数组中存放着{1, 3,5,…,99}输出这个数组中的所有元素,每输出十个换一行;在主方法中定义一 个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。
int[]x=new int [50]; char[][]y=new char[10][10]; int j=1,w=0; for(int i=0;i<50;i++) { x[i]=j; j+= ...
- 编写一个名为Test的主类,类中只有一个主方法; 在主方法中定义一个大小为50的一维整型数组,数组名为x,数组中存放着{1, 3,5,…,99}输出这个数组中的所有元素,每输出十个换一行;在主方法中定义一 个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。
package liu0915; import java.util.Random; public class Test0915sz { public static void main(String[] ...
- 05 . Go+Vue开发一个线上外卖应用(Session集成及修改用户头像到Fastdfs)
用户头像上传 功能介绍 在用户中心中,允许用户更换自己的头像.因此,我们开发上传一张图片到服务器,并保存成为用户的头像. 接口解析 在用户模块的控制器MemberController中,解析头像上传的 ...
随机推荐
- vue--v-model 的三种修饰符lazy、number、trim
Vue--v-model的三种修饰符lazy.number.trim v-model.lazy: 值修改操作完成之后才会发生变化. v-model.number: 只修改时,保持其值为Number类 ...
- ubuntu手动创建快捷方式
新建document,重命名为XXX.desktop,打开文件 以sublime为例,填写 [Desktop Entry] Version=1.0 Type=Application Name=Subl ...
- Ubuntu 14.04环境编译android源码android-5.0.2_r1.7z
环境: Win7:8G内存 vmware:vm给ubuntu分配4G内存80G空间 参考视频: https://www.bilibili.com/video/BV15t411R78o ubuntu14 ...
- 什么是RPA?RPA能干什么?
一.什么是RPA什么是RPA? RPA的全称为机器人流程自动化(Robotic Process Automation),即:"机器人流程自动化",是一种智能化的企业流程管理系统.R ...
- 《golong入门教程📚》,从零开始入门❤️(建议收藏⭐️)
Go语言学习笔记 本菜鸟的Go语言学习笔记,历时1个月,包含了Go语言大部分的基本语法(不敢说全部),学习期间参考了各种视频,阅读了各种文章,主要参考名单如下: 点击跳转到参考名单<( ̄︶ ̄)& ...
- ExcelDataReader插件的使用
NPOI插件的弊端 刚来公司的时候公司软件导入导出操作都使用微软的office组件来实现,大家应该都知道这个组件有很大的弊端,就是运行主机上面必须安装office组件才可进行使用,不然无法进行导入导出 ...
- 《3D编程模式》写书-第1天记录
大家好,我现在开始写书了,书名为:<3D编程模式> 我会在本系列博文中记录写书的整个过程,感谢大家支持! 这里是所有的的写书记录: <3D编程模式>写书记录 为什么写书 去年我 ...
- odoo 开发入门教程系列-模型之间的关系(Relations Between Models)
模型之间的关系(Relations Between Models) 上一章介绍了为包含基本字段的模型创建自定义视图.然而,在任何真实的业务场景中,我们都需要不止一个模型.此外,模型之间的链接是必要的. ...
- 集合-HashMap 源码详细分析(JDK1.8)
1. 概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap.HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现.HashMap 允许 null 键和 null 值 ...
- Django之时区修改
修改时区方法 环境:windows10 修改settings.py文件,修改TIME_ZONE和USE_TZ参数 TIME_ZONE = 'Asia/Shanghai' USE_TZ = False