2023-05-07:给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。 返回执行此操作后,grid 中最大的岛屿面积是多少? 岛屿 由一组上、下、左、右四个方向相

这篇具有很好参考价值的文章主要介绍了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(n2) ,遍历了三次矩阵,每次遍历的时间复杂度均为 O ( n 2 ) O(n^2) O(n2)

空间复杂度: O ( n 2 ) O(n^2) O(n2),使用了两个二维数组,每个数组都是 n × n n \times n n×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
}

2023-05-07:给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。 返回执行此操作后,grid 中最大的岛屿面积是多少? 岛屿 由一组上、下、左、右四个方向相,福大大架构师每日一题,rust,线性代数,golang,算法

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);
}

2023-05-07:给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。 返回执行此操作后,grid 中最大的岛屿面积是多少? 岛屿 由一组上、下、左、右四个方向相,福大大架构师每日一题,rust,线性代数,golang,算法

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);
}

2023-05-07:给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。 返回执行此操作后,grid 中最大的岛屿面积是多少? 岛屿 由一组上、下、左、右四个方向相,福大大架构师每日一题,rust,线性代数,golang,算法

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 中最大的岛屿面积是多少? 岛屿 由一组上、下、左、右四个方向相,福大大架构师每日一题,rust,线性代数,golang,算法文章来源地址https://www.toymoban.com/news/detail-677765.html

到了这里,关于2023-05-07:给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。 返回执行此操作后,grid 中最大的岛屿面积是多少? 岛屿 由一组上、下、左、右四个方向相的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 1253. 重构 2 行二进制矩阵

    1253. 重构 2 行二进制矩阵 给你一个  2  行  n  列的二进制数组: 矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是  0  就是  1 。 第  0  行的元素之和为  upper 。 第  1  行的元素之和为  lower 。 第  i  列(从  0  开始编号)的元素之和为  colsum[i] , colsum  是

    2024年02月16日
    浏览(48)
  • LeetCode 1253. 重构 2 行二进制矩阵

    力扣题目链接:https://leetcode.cn/problems/reconstruct-a-2-row-binary-matrix/ 给你一个  2  行 n 列的二进制数组: 矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是  0  就是  1 。 第 0 行的元素之和为  upper 。 第 1 行的元素之和为 lower 。 第 i 列(从 0 开始编号)的元素之和为

    2024年02月11日
    浏览(41)
  • 07-2_Qt 5.9 C++开发指南_二进制文件读写(stm和dat格式)

    除了文本文件之外,其他需要按照一定的格式定义读写的文件都称为二进制文件 。每种格式的二进制文件都有自己的格式定义,写入数据时按照一定的顺序写入,读出时也按照相应的顺序读出。例如地球物理中常用的 SEG-Y 格式文件,必须按照其标准格式要求写入数据才符合

    2024年02月13日
    浏览(46)
  • 【1091. 二进制矩阵中的最短路径】

    来源:力扣(LeetCode) 描述: 给你一个 n x n 的二进制矩阵 grid 中,返回矩阵中最短 畅通路径 的长度。如果不存在这样的路径,返回 -1 。 二进制矩阵中的 畅通路径 是一条从 左上角 单元格(即, (0, 0) )到 右下角 单元格(即, (n - 1, n - 1) )的路径,该路径同时满足下述要

    2024年02月08日
    浏览(49)
  • 【每日一题】1253. 重构 2 行二进制矩阵

    给你一个 2 行 n 列的二进制数组: 矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是 0 就是 1。 第 0 行的元素之和为 upper。 第 1 行的元素之和为 lower。 第 i 列(从 0 开始编号)的元素之和为 colsum[i],colsum 是一个长度为 n 的整数数组。 你需要利用 upper,lower 和 colsu

    2024年02月12日
    浏览(45)
  • ​LeetCode解法汇总253. 重构 2 行二进制矩阵

    https://github.com/September26/java-algorithms 给你一个  2  行  n  列的二进制数组: 矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是  0  就是  1 。 第  0  行的元素之和为  upper 。 第  1  行的元素之和为  lower 。 第  i  列(从  0  开始编号)的元素之和为  colsum[i] ,

    2024年02月11日
    浏览(49)
  • 如何将一个实例的内存二进制内容读出来?

    在《如何计算一个实例占用多少内存?》中我们知道一个值类型或者引用类型的实例在内存中占多少字节。如果我们知道这段连续的字节序列的初始地址,我们就能够将代表该实例的字节内容读取出来。在接下来的内容中,我们将利用一个简单的方法输出指定实例的字节序列

    2024年02月08日
    浏览(61)
  • 【算法】Reconstruct a 2-Row Binary Matrix 重构 2 行二进制矩阵

    给你一个 2 行 n 列的二进制数组: 矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是 0 就是 1。 第 0 行的元素之和为 upper。 第 1 行的元素之和为 lower。 第 i 列(从 0 开始编号)的元素之和为 colsum[i],colsum 是一个长度为 n 的整数数组。 你需要利用 upper,lower 和 colsu

    2024年02月12日
    浏览(54)
  • 2023-06-14 LeetCode每日一题(二进制字符串前缀一致的次数)

    点击跳转到题目位置 给你一个长度为 n 、下标从 1 开始的二进制字符串,所有位最开始都是 0 。我们会按步翻转该二进制字符串的所有位(即,将 0 变为 1)。 给你一个下标从 1 开始的整数数组 flips ,其中 flips[i] 表示对应下标 i 的位将会在第 i 步翻转。 二进制字符串 前缀

    2024年02月08日
    浏览(54)
  • 【每日一题Day218】LC1091 二进制矩阵中的最短路径 | BFS

    你驾驶出租车行驶在一条有 n 个地点的路上。这 n 个地点从近到远编号为 1 到 n ,你想要从 1 开到 n ,通过接乘客订单盈利。你只能沿着编号递增的方向前进,不能改变方向。 乘客信息用一个下标从 0 开始的二维数组 rides 表示,其中 rides[i] = [starti, endi, tipi] 表示第 i 位乘客

    2024年02月08日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包