计算最大海岛面积

news2025/3/4 10:15:56

最大海岛面积问题的不同解法

问题举例

给定一个包含了一些 0 和 1 的非空二维数组 matrix 。

一个岛屿是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设matrix的四个边缘都被 0(代表水)包围着。

找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)

示例 1:

[[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 。

解题思路

上面的示例中,任意相邻的1构成一个海岛,则最大海岛面积,就是成片的1里面1的最大数量。这个是典型的图面问题,可以用深度优先搜索、基于栈的深度优先搜索、广度优先搜等思路来求解。

深度优先搜索:
1. 初始化岛屿面积为0;
2. 如果某个位置数值越界、数值为0或者已经搜索过,跳过;
3. 如果某个点数值为1,且未搜索过,岛屿面积加1,该位置标记为已搜索,然后往上下左右四个方向搜索(执行过程2~3);
4. 搜索结束后,返回当前搜索岛屿的面积
5. 遍历矩阵的各个位置,计算岛屿面积最大值;
6. 输出最大值;

深度优先搜索方法能快速求出岛屿最大面积,但矩阵规模较大时,因为深度搜索层数较多,可能存在栈溢出问题,因此产生了基于栈的深度优先搜索方法。

基于栈的深度优先搜索:
1. 初始化岛屿面积为0,初始化栈(记录数值为1的位置);
2. 如果某个位置数值越界、数值为0或者已经搜索过,跳过;
3. 如果某个点数值为1,且未搜索过,岛屿面积加1,该位置标记为已搜索,该位置压入栈中;
4. 记录栈顶位置,栈顶元素出栈,然后栈顶元素往上下左右四个方向搜索(执行过程2~3);
5. 栈为空时,搜索结束,返回当前搜索岛屿的面积
6. 遍历矩阵的各个位置,计算岛屿面积最大值;
7. 输出最大值;

该方法用栈对已搜索过的位置进行了存储,避免了搜索层数过多问题,能有效避免栈溢出。

广度优先搜索:
1. 初始化岛屿面积为0,初始化队列(记录数值为1的位置);
2. 如果某个位置数值越界、数值为0或者已经搜索过,跳过;
3. 如果某个点数值为1,且未搜索过,岛屿面积加1,该位置标记为已搜索,该位置压入队列中;
4. 记录队首位置,队首元素弹出,然后往上下左右四个方向搜索(执行过程2~3);
5. 队列为空时,搜索结束,返回当前搜索岛屿的面积
6. 遍历矩阵的各个位置,计算岛屿面积最大值;
7. 输出最大值;

广度优先搜索和基于栈的深度优先搜索方法原理接近,但用不同的数据结构来存储搜索过的位置,因此弹出元素不一样,后续搜索位置也不一样。

代码实现

基于栈的深度优先搜索

class DfsClass
{
public: 
    std::vector<std::vector<int>> Matrix;
    std::vector<int> Dir = { -1,0,1,0,-1 };
    int GetMaxValue()
    {
        int maxValue = 0;
        for (int i = 0; i < Matrix.size(); ++i)
        {
            for (int j = 0; j < Matrix[i].size(); ++j)
            {
                if (Matrix[i][j] == 0) continue;
                int tempValue = Matrix[i][j];
                Matrix[i][j] = 0;
                std::stack<std::pair<int, int>> tempStack;
                tempStack.push(std::make_pair(i, j));
                while (!tempStack.empty())
                {
                    std::pair<int, int> top = tempStack.top();
                    tempStack.pop();
                    for (int k = 0; k < 4; ++k)
                    {
                        int x = top.first + Dir[k];
                        int y = top.second + Dir[k+1];
                        if (x >= 0 && x < Matrix.size() && y >= 0 && y < Matrix[x].size() && Matrix[x][y]>0)
                        {
                            tempValue = tempValue + Matrix[x][y];
                            Matrix[x][y] = 0;
                            tempStack.push(std::make_pair(x, y));
                        }
                    }
                }
                maxValue = std::max(maxValue, tempValue);
            }
        }
        return maxValue;
    }
};

int GetMaxValue(std::vector<std::vector<int>> matrix)
{
    DfsClass* dnfClass = new DfsClass();
    dnfClass->Matrix = matrix;
    return dnfClass->GetMaxValue();
}

int main()
{
	std::vector<std::vector<int>> matrix =
	{
		{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}
	};
	int maxValue = GetMaxValue(matrix);
	std::cout << maxValue;
}


其他的深度优先和广度优先代码类似,不再提供。

结果

最大岛屿标记位置如图示(倾斜加粗位置):
{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。

代码运行结果如下图:
在这里插入图片描述

因此,代码运行结果符合预期。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2309443.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spark核心之02:RDD、算子分类、常用算子

spark内存计算框架 一、目标 深入理解RDD弹性分布式数据集底层原理掌握RDD弹性分布式数据集的常用算子操作 二、要点 ⭐️1. RDD是什么 RDD&#xff08;Resilient Distributed Dataset&#xff09;叫做**弹性分布式数据集&#xff0c;是Spark中最基本的数据抽象&#xff0c…

[Windows] 批量为视频或者音频生成字幕 video subtitle master 1.5.2

Video Subtitle Master 1.5.2 介绍 Video Subtitle Master 1.5.2 是一款功能强大的客户端工具&#xff0c;能够批量为视频或音频生成字幕&#xff0c;还支持批量将字幕翻译成其他语言。该工具具有跨平台性&#xff0c;无论是 mac 系统还是 windows 系统都能使用。 参考原文&a…

进来了解一下python的深浅拷贝

深浅拷贝是什么&#xff1a;在Python中&#xff0c;理解深拷贝&#xff08;deep copy&#xff09;和浅拷贝&#xff08;shallow copy&#xff09;对于处理复杂的数据结构&#xff0c;如列表、字典或自定义对象&#xff0c;是非常重要的。这两种拷贝方式决定了数据在内存中的复制…

解锁GPM 2.0「卡顿帧堆栈」|代码示例与实战分析

每个游戏开发者都有一个共同的愿望&#xff0c;那就是能够在无需复现玩家反馈的卡顿现象时&#xff0c;快速且准确地定位卡顿的根本原因。为了实现这一目标&#xff0c;UWA GPM 2.0推出了全新功能 - 卡顿帧堆栈&#xff0c;旨在为开发团队提供高效、精准的卡顿分析工具。在这篇…

微服务,服务治理nacos,负载均衡LOadBalancer,OpenFeign

1.微服务 简单来说&#xff0c;微服务架构风格[1]是一种将一个单一应用程序开发为一组小型服务的方法&#xff0c;每个服务运行在 自己的进程中&#xff0c;服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并 且可通过全自动部署机制独立部署。这…

栈和队列的模拟实现

文章目录 一. 回顾栈和队列二. stack的模拟实现stack.hstack.cpp 三. queue的模拟实现queue.htest.cpp 四. 了解dequeuevector和list都有各自的缺陷deque 总结 一. 回顾栈和队列 回顾一下栈和队列 栈&#xff1a;stack&#xff1a;后进先出 _ 队列&#xff1a;queue&#xf…

unity pico开发 四 物体交互 抓取 交互层级

文章目录 手部设置物体交互物体抓取添加抓取抓取三种类型抓取点偏移抓取事件抓取时不让物体吸附到手部 射线抓取交互层级 手部设置 为手部&#xff08;LeftHandController&#xff09;添加XRDirInteractor脚本 并添加一个球形碰撞盒&#xff0c;勾选isTrigger,调整大小为0.1 …

【PromptCoder + Cursor】利用AI智能编辑器快速实现设计稿

【PromptCoder Cursor】利用AI智能编辑器快速实现设计稿 官网&#xff1a;PromptCoder 在现代前端开发中&#xff0c;将设计稿转化为可运行的代码是一项耗时的工作。然而&#xff0c;借助人工智能工具&#xff0c;这一过程可以变得更加高效和简单。本文将介绍如何结合 Promp…

MySQL面试01

MySQL 索引的最左原则 &#x1f370; 最左原则本质 ͟͟͞͞( •̀д•́) 想象复合索引是电话号码簿&#xff01; 索引 (a,b,c) 的排列顺序&#xff1a; 先按a排序 → a相同按b排序 → 最后按c排序 生效场景三连&#xff1a; 1️⃣ WHERE a1 ✅ 2️⃣ WHERE a1 AND b2 ✅ 3️…

webpack一篇

目录 一、构建工具 1.1简介 二、Webpack 2.1概念 2.2使用步骤 2.3配置文件&#xff08;webpack.config.js&#xff09; mode entry output loader plugin devtool 2.4开发服务器&#xff08;webpack-dev-server&#xff09; grunt/glup的对比 三、Vite 3.1概念 …

健康饮食,健康早餐

营养早餐最好包含4大类食物&#xff1a;谷薯类&#xff1b;碳水&#xff1b;蛋白质&#xff1b;膳食纤维。 1.优质碳水 作用&#xff1a;提供持久的能量&#xff0c;避免血糖大幅波动等 例如&#xff1a;全麦面包、红薯&#x1f360;、玉米&#x1f33d;、土豆&#x1f954;、…

【经验分享】Ubuntu20.04 vmware虚拟机存储空间越来越小问题(已解决)

【经验分享】Ubuntu20.04 vmware虚拟机存储空间越来越小问题&#xff08;已解决&#xff09; 前言一、问题分析二、解决方案 前言 我们在使用虚拟机过程中&#xff0c;经常会碰到即使删除了一些文件&#xff0c;但是存储空间还是越来越小的问题。今天我们来解决下这个问题。 一…

Jenkins-自动化部署-通知

场景 使用jenkins部署&#xff0c;但有时不能立马部署&#xff0c;需要先通知相关人员&#xff0c;再部署&#xff0c;如果确实不能部署&#xff0c;可以留时间撤销。 方案 1.开始前我们添加&#xff0c;真正开始执行的等待时间&#xff1b;可供选择&#xff08;Choice Param…

Qt 文件操作+多线程+网络

文章目录 1. 文件操作1.1 API1.2 例子1&#xff0c;简单记事本1.3 例子2&#xff0c;输出文件的属性 2. Qt 多线程2.1 常用API2.2 例子1&#xff0c;自定义定时器 3. 线程安全3.1 互斥锁3.2 条件变量 4. 网络编程4.1 UDP Socket4.2 UDP Server4.3 UDP Client4.4 TCP Socket4.5 …

《基于Hadoop的青岛市旅游景点游客行为分析系统设计与实现》开题报告

目录 一、选题依据 1.选题背景 2.国内外研究现状 &#xff08;1&#xff09;国内研究现状 &#xff08;2&#xff09;国外研究现状 3.发展趋势 4.应用价值 二、研究内容 1.学术构想与思路 2. 拟解决的关键问题 3. 拟采取的研究方法 4. 技术路线 (1)旅游前准备阶段 …

pycharm debug卡住

pycharm debug时一直出现 collecting data, 然后点击下一行就卡住。 勾选 Gevent compatible解决 https://stackoverflow.com/questions/39371676/debugger-times-out-at-collecting-data

ISP 常见流程

1.sensor输出&#xff1a;一般为raw-OBpedestal。加pedestal避免减OB出现负值&#xff0c;同时保证信号超过ADC最小电压阈值&#xff0c;使信号落在ADC正常工作范围。 2. pedestal correction&#xff1a;移除sensor加的基底&#xff0c;确保后续处理信号起点正确。 3. Linea…

java数据结构_Map和Set(一文理解哈希表)_9.3

目录 5. 哈希表 5.1 概念 5.2 冲突-概念 5.3 冲突-避免 5.4 冲突-避免-哈希函数的设计 5.5 冲突-避免-负载因子调节 5.6 冲突-解决 5.7 冲突-解决-闭散列 5.8 冲突-解决-开散列 / 哈希桶 5.9 冲突严重时的解决办法 5. 哈希表 5.1 概念 顺序结构以及平衡树中&#x…

基于SpringBoot的“数据驱动的资产管理系统站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“数据驱动的资产管理系统站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 局部E-R图 系统登录界…

excel 斜向拆分单元格

右键-合并单元格 右键-设置单元格格式-边框 在设置好分割线后&#xff0c;你可以开始输入文字。 需要注意的是&#xff0c;文字并不会自动分成上下两行。 为了达到你期望的效果&#xff0c;你可以通过 同过左对齐、上对齐 空格键或使用【AltEnter】组合键来调整单元格中内容的…