当前位置: 首页 > news >正文

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

结果展示 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 深度学习入门——与学习相关的技巧
  • 学习记录--GPT
  • QT获取电脑网卡IP等信息
  • Spring boot 运行环境搭建之Spring Tools 4 for Eclipse
  • STM32、Spring Boot、MQTT和React Native:智能停车管理系统的全栈开发详解(附代码示例)
  • react-draft-wysiwyg API
  • Nacos 服务发现(订阅)源码分析(服务端)
  • 数据仓库事实表
  • 【微服务实战之Docker容器】第六章-复杂安装(Mysql主从Redis集群)
  • 代理伺服器分類詳解
  • ArcGIS Pro SDK (九)几何 10 弧
  • 【数据结构】初识数据结构
  • AI、AGI、AIGC与AIGC、NLP、LLM,ChatGPT区分
  • Nature子刊 | ATAC-seq、RNA-seq和蛋白组联合分析揭示脂质激活转录因子PPARα在肾脏代偿性肥大的作用机制
  • pdf怎么压缩的小一点?PDF压缩变小的6种方法(2024全新)
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • bearychat的java client
  • const let
  • github指令
  • interface和setter,getter
  • node学习系列之简单文件上传
  • OSS Web直传 (文件图片)
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Python连接Oracle
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • 闭包,sync使用细节
  • 从输入URL到页面加载发生了什么
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 前端技术周刊 2019-01-14:客户端存储
  • 试着探索高并发下的系统架构面貌
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 我是如何设计 Upload 上传组件的
  • 新版博客前端前瞻
  • 正则表达式
  • 阿里云重庆大学大数据训练营落地分享
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​数据链路层——流量控制可靠传输机制 ​
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (二)c52学习之旅-简单了解单片机
  • (三) diretfbrc详解
  • (顺序)容器的好伴侣 --- 容器适配器
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)jQuery 基础
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • . NET自动找可写目录
  • .Net CoreRabbitMQ消息存储可靠机制
  • .net dataexcel winform控件 更新 日志
  • .Net Redis的秒杀Dome和异步执行
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET命名规范和开发约定