LeetCode岛屿的最大面积(深度搜索)/什么是深搜,简单案例回顾图用邻接表实现图的深度优先遍历。

看这道题不懂深度搜索的可以看看下面讲述 

岛屿的最大面积

 

解题思路

 代码

class Solution {int dfs(vector<vector<int>>& grid, int cur_i, int cur_j) {//确定边界if((cur_i >=0 && cur_i < grid.size()) && (cur_j >=0 && cur_j < grid[0].size())){//判断是否是陆地if(grid[cur_i][cur_j] == 0) return 0;else{grid[cur_i][cur_j] = 0;//在进行dfs深度遍历return 1+dfs(grid,cur_i-1,cur_j) + dfs(grid,cur_i+1,cur_j) +dfs(grid,cur_i,cur_j-1) + dfs(grid,cur_i,cur_j+1);}}else{return 0;}}
public:int maxAreaOfIsland(vector<vector<int>>& grid) {int count = 0;for(int i = 0;i< grid.size();i++){for(int j=0;j<grid[0].size();j++){count = max(count,dfs(grid,i,j));}}return count;}
};

时间复杂度O(i*j) 每次都会以二维数组中某一个点为起点,进行深度搜索。

空间复杂度O(I*J) 因为递归的最大情况是,所有数组的元素都是1,这样递归的深度最大就是数组的面积大小。

深度搜索

具体解释 

深度搜素需要用到栈来实现

@ 1 第一步如果以0为起点 ,先输出0,再以(1,4,3)中其中任意一个邻接点进行深度搜索也就是递归。

@ 2 第二步,如果到达4,在到达4之前将0入栈,输出4

@ 3 第三步 ,到达下一个邻接点2,将4入栈,输出2.

@4 第四步,到达下一个邻接电1,将2入栈,输出1.

@5 第五步,访问1后,1没有邻接点,于是将栈出栈。

@6 第六步,出栈2,发现2有邻接点3,将3输出,3后没有没有访问的邻接点继续出栈

@7第七步,出栈4,0。栈空。程序截止。

下面举一个具体的深度搜索的例子

画一个横着的图: 4----2---0---1---3 从起始点0开始进行深搜。

结果是:02413 或者 01324.

#include <iostream>
#include <vector>
#include <stack>using namespace std;// 图的结构体,使用邻接表表示
struct Graph {int V; // 图的顶点数vector<vector<int>> adj; // 邻接表// 构造函数,初始化图的顶点数和邻接表Graph(int V) {this->V = V;adj.resize(V);}// 添加边,无向图void addEdge(int v, int w) {adj[v].push_back(w); // v 和 w 之间有一条边adj[w].push_back(v); // 因为是无向图,所以也要反向添加}// 深度优先搜索void DFS(int start) {// 记录访问状态的数组,初始都未访问过vector<bool> visited(V, false);// 使用栈来实现递归调用的效果stack<int> stack;// 将起始节点压入栈中stack.push(start);while (!stack.empty()) {// 弹出栈顶元素int v = stack.top();stack.pop();// 如果当前节点未访问过,则访问它if (!visited[v]) {cout << v << " ";visited[v] = true;}// 遍历当前节点的所有邻接节点for (int neighbor : adj[v]) {// 如果邻接节点未访问过,则压入栈中if (!visited[neighbor]) {stack.push(neighbor);}}}}
};int main() {// 创建一个包含 5 个顶点的图Graph g(5);// 添加边构成图g.addEdge(0, 1);g.addEdge(0, 2);g.addEdge(1, 3);g.addEdge(2, 4);cout << "深度优先搜索结果(从顶点0开始): ";g.DFS(0); // 从顶点 0 开始进行深度优先搜索return 0;
}

结果展示 

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

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

相关文章

新手教程---python-函数(新添加)

一、递归函数 在Python中&#xff0c;递归函数是指一个函数调用自身的过程。递归函数一般包括两个部分&#xff1a;基本情况和递归情况。 基本情况是指在递归过程中终止递归的条件。如果不满足基本情况&#xff0c;递归函数将进入递归情况&#xff0c;调用自身&#xff0c;并缩…

开机出现grub无法进入系统_电脑开机出现grub解决方法

最近有小伙伴问我电脑开机出现grub无法进入系统怎么回事&#xff1f;电脑开机出grub的情况有很多&#xff0c;电脑上安装了Linux和Win10双系统&#xff0c;但是由于格式化删除了Linux之后&#xff0c;结果win10开机了之后&#xff0c;直接显示grub&#xff1e;&#xff0c;无法…

MySQL事务管理(上)

MySQL注定会被多个用户或者客户端&#xff0c;因为MySQL存的是数据&#xff1b;MySQL内部使用的是多线程的方式来实现数据的存储工作&#xff1b; 前言 CURD不加控制&#xff0c;会有什么问题&#xff1f; 如今有个数据库里面是火车票售票系统所对应的数据库表&#xff1b;M…

Spring Boot:简化Spring应用开发的利器

引言 在现代Java开发中&#xff0c;Spring框架已经成为了构建企业级应用的事实标准。然而&#xff0c;Spring框架的强大功能也带来了复杂的配置和初始化过程。为了简化开发流程&#xff0c;Spring团队推出了Spring Boot&#xff0c;一个专注于快速构建生产级Spring应用的框架。…

.net6 core Worker Service项目,使用Exchange Web Services (EWS) 分页获取电子邮件收件箱列表,邮件信息字段

Program.cs 安装包&#xff1a;Microsoft.AspNetCore.Hosting.WindowsServices、Microsoft.Extensions.Hosting、Microsoft.Extensions.Hosting.WindowsServices、Microsoft.Extensions.Logging.Log4Net.AspNetCore 新建Configs/log4net.config using Com.Chinahorn.Exchange.W…

ubantu22.04安装OceanBase 数据库

1、管理员启动cmd,运行 sudo bash -c "$(curl -s https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/download-center/opensource/service/installer.sh)" 2、提示如下代表安装完成 3、修改数据库配置文件的密码 sudo vim /etc/oceanbase.cnf 然后保存退…

正则表达式(Ⅰ)——基本匹配

学习练习建议 正则表达式用途非常广泛&#xff0c;各种语言中都能见到它的身影&#xff08;js&#xff0c;java&#xff0c;mysql等&#xff09; 正则表达式可以快读校验/生成/替换符合要求的模式的字符串&#xff0c;而且语法通俗易懂&#xff0c;所以应用广泛 学习链接&am…

css前端面试题

1.什么是css盒子模型&#xff1f; 盒子模型包含了元素内容&#xff08;content&#xff09;、内边距&#xff08;padding&#xff09;、边框&#xff08;border&#xff09;、外边距&#xff08;margin&#xff09;几个要素。 标准盒子模型和IE盒子模型的区别在于其对元素的w…

C++模板进阶和模板链接错误的解决

小编在学习模板进阶之后&#xff0c;觉得模板的内容很有用&#xff0c;所以今天带给大家的内容是模板进阶的所有内容&#xff0c;内容包括模板的使用&#xff0c;模板的特化&#xff0c;模板的全特化&#xff0c;模板的偏特化&#xff0c;模板链接时候会出现的链接错误及解决方…

HTML5的离线存储

HTML5的离线存储 HTML5的离线储存使用方法1.创建并配置缓存清单&#xff1a;2.将缓存清单与HTML文件相关联&#xff1a;3.&#xff08;可选&#xff09;使用JavaScript调用应用程序缓存对象&#xff1a; 工作原理 HTML5的离线储存使用方法 HTML5的离线储存功能允许Web应用程序…

Ubuntu系统SSH免密连接Github配置方法

Ubuntu系统SSH免密连接Github配置方法 一、相关介绍1.1 Ubuntu简介1.2 Git简介1.3 Github简介 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本 四、Git本地环境配置工作4.1 安装Git工具4.2 创建项目目录4.3 …

STM32被拔网线 LWIP的TCP无法重连解决方案

目录 一、问题描述 二、项目构成 三、问题解决 1.问题代码 2.解决思路 3.核心代码&#xff1a; 四、完整代码 1.监测网口插入拔出任务 2.TCP任务 3.创建tcp任务 4.删除tcp任务 五、总结 一、问题描述 最近遇到一个问题&#xff0c;就是我的stm32设备作为tcp客户端…

什么是TCP/IP协议

一、TCP/IP协议概述 TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff09;协议&#xff0c;即传输控制协议/因特网互联协议&#xff0c;是Internet最基本的协议&#xff0c;也是国际互联网络的基础。它是一组协议的集合&#xff0c;旨在实现计算机…

AndroidStudio与手机进行无线调试

(一)、前提条件 一部手机一条USB数据线一部电脑手机和电脑连接到同一个 Wifi开启手机的USB调试功能开启手机的无线调试功能 (二)、操作步骤 1、 将手机和电脑用USB数据线连接 2、 打开 终端&#xff0c;输入 adb devices ,查看手机和电脑是否连接成功。如下图&#xff1a; 2、…

Linux驱动开发-06蜂鸣器和多组GPIO控制

一、控制蜂鸣器 1.1 控制原理 我们可以看到SNVS_TAMPER1是这个端口在控制着蜂鸣器,同时这是一个PNP型的三极管,在端口输出为低电平时,蜂鸣器响,在高电平时,蜂鸣器不响 1.2 在Linux中端口号的控制 gpiochipX:当前SoC所包含的GPIO控制器,我们知道I.MX6UL/I.MX6ULL一共包…

Atom - hackmyvm

简介 靶机名称&#xff1a;Atom 难度&#xff1a;简单 靶场地址&#xff1a;https://hackmyvm.eu/machines/machine.php?vmAtom 本地环境 虚拟机&#xff1a;vitual box 靶场IP&#xff08;Atom&#xff09;&#xff1a;192.168.56.101 跳板机IP(windows 11)&#xff1…

网络安全-网络安全及其防护措施12

56.云计算网络架构 概念和特点 云计算网络架构是为支持云计算服务模型&#xff08;如IaaS、PaaS、SaaS&#xff09;而设计的网络布局和管理方案。它旨在实现高效的资源共享、弹性扩展和灵活的服务交付。云计算网络架构结合了虚拟化技术、自动化管理和软件定义网络&#xff08…

多显示器,如何快速切换电脑显示模式!

​一般在使用多显示器的情况下,可能我们要根据不同的工作需求来动态调整相适应的Windows显示模式,像扩展模式、复制模式、单显示器等模式。调整相应的模式方法也不止一种,下面一起了解下不同的方法如何快速操作实现! 快捷键法(WIN+P) 同时按下键盘徽标键WIN+P,会弹出个选…

批量更新 AWS ECS Fargate 服务:自动化平台版本升级

在使用 AWS ECS Fargate 时,我们经常会收到平台版本更新的通知。为了确保我们的服务运行在最新的平台版本上,我们需要更新所有受影响的任务。本文将介绍如何使用 Python 和 AWS SDK (boto3) 来批量更新 ECS Fargate 服务,自动化这一过程。 背景 AWS Fargate 会定期发布新的…

Ajax是什么?如何在HTML5中使用Ajax?

Ajax是什么&#xff0c;它如何工作&#xff1f; Ajax是什么 Ajax&#xff0c;全称Asynchronous Javascript And XML&#xff08;异步JavaScript和XML&#xff09;&#xff0c;是一种创建交互式网页应用的网页开发技术。它允许网页在不重新加载整个页面的情况下&#xff0c;与…