算法|图论 1 广度深度

LeetCode 695- 岛屿的最大面积

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

题目描述:给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序

graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一条有向边)。

解题思路

  1. 首先确定递归函数的参数,返回值。本题要路径,我们直接设置两个全局变量result和path,这样可以不用写太多参数传递。返回值就是void,参数需要图和一个start。start来标记我们当前走到了哪个节点,下次从这个节点开始走的。
  2. 确定终止条件,本题是到特定点的路径,所以path的最后一个数值为特定节点就终止。即start == graph.size()-1
  1. 单层处理逻辑,每次将当前节点中能通向的路径都走一遍,也就是将其全部都递归一遍。
class Solution {
public:vector<int> path;vector<vector<int>> result;void traversal(vector<vector<int>>& graph,int start){if(start == graph.size()-1){result.push_back(path);//return ;}for(int i=0;i<graph[start].size();i++){path.push_back(graph[start][i]);traversal(graph,graph[start][i]);path.pop_back();}}vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {path.push_back(0);traversal(graph,0);return result;}
};

总结:

  • 递归的应用

LeetCode 200- 岛屿数量

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

题目描述:给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

解题思路

思路一(深度优先遍历):

  1. 首先确定递归函数的参数,返回值。本题不需要这些。
  2. 确定终止条件,本题按我们的逻辑,先进入循环再判断是否应该终止,那么终止条件就是:当超出网格范围就终止。
  1. 单层处理逻辑,每次我们将当前节点的岛屿的值设置为0,模拟为被淹没,并且去淹没当前节点的上下左右相邻的节点。为1的节点为陆地状态。

class Solution {
public:int numIslands(vector<vector<char>>& grid) {int islandNum = 0;for (int i = 0; i < grid.size(); i++) {for (int j = 0; j < grid[0].size(); j++) {//如果是陆地,那就进行深度优先遍历,不断淹没陆地if (grid[i][j] == '1') {dfs(grid, i, j);islandNum++;}}}return islandNum;}
public:void dfs(vector<vector<char>>& grid, int i, int j) {//这里是先进递归,后判断是否符合条件,不符合直接return,符合才会向更深处递归。if (i < 0 || j < 0  || i >= grid.size() || j >= grid[0].size() ||  grid[i][j] != '1') return;grid[i][j] = '0';dfs(grid, i + 1, j);dfs(grid, i - 1, j);dfs(grid, i, j + 1);dfs(grid, i, j - 1);}
};

思路二(广度优先遍历):

用队列模拟广度优先,首先入队第一个遇到的陆地,然后遍历其上下左右的空间,是陆地就入队且淹没,非陆地就不操作,不断进行,直到全部变为海洋为止。

class Solution {
public:int dir[4][2] = {0,1,1,0,-1,0,0,-1};//定义四个方向的走向,这个4x2的矩阵就是代表4个方向int numIslands(vector<vector<char>>& grid) {int res = 0;int n = grid.size(),m = grid[0].size();for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(grid[i][j] == '1'){//当遇到陆地时,进行广度优先遍历bfs(grid,i,j);//广度优先结束后,说明刚刚淹没一片陆地,res++,res ++;		  //若下次还有陆地要淹,则res会继续++} }}return res;}void bfs(vector<vector<char>> &grid,int x,int y){queue<pair<int,int>> que;//队列模拟广度优先,其中存储的是对组,为x,y坐标que.push({x,y});//首先压入传进来的岛屿的位置grid[x][y] = '0';//将其淹没while(!que.empty()){//若队列不为空,则一直循环pair<int,int> cur = que.front();//取出头部的陆地坐标que.pop();int curx = cur.first;//赋值给当前x,y坐标int cury = cur.second;//对四个方向进行遍历,也就是对当前陆地的一周进行遍历,如果有陆地,那就入队。for(int i=0;i<4;i++){int nextx = curx + dir[i][0];int nexty = cury + dir[i][1];//如果当前走的一步没有越界,且是陆地,则将其入队,然后淹没。if(nextx < 0 || nexty < 0 || nextx >= grid.size() || nexty >= grid[0].size() ||grid[nextx][nexty] != '1') continue;que.push({nextx,nexty});grid[nextx][nexty] = '0';}}}
};

总结:

  • 与其想符合条件的递归,不如想不符合条件的返回(高效又不易错)。本题体现在与其去想怎么样进入递归,不如想什么情况下进入递归了不符合条件直接返回。

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

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

相关文章

69、Spring Data JPA 的 @Query查询 和 命名查询

Query查询 和 命名查询的区别&#xff1a; 命名查询与直接用Query来定义查询的本质是一样&#xff0c;只不过它们定义SQL或JPQL语句的位置不同。 直接用 Query来定义查询 &#xff0c;写SQL或JPQL语句的位置在 DAO 组件&#xff0c; 命名查询&#xff0c;写SQL或JPQL语句的位置…

神经网络与强化学习:揭示AI的超能力

文章目录 神经网络&#xff1a;模拟人脑的工具强化学习&#xff1a;通过试错学习结合神经网络和强化学习价值网络策略网络结合训练 应用领域游戏机器人控制金融交易 未来趋势自动化和自主系统个性化和自适应系统跨学科研究 结论 &#x1f389;欢迎来到AIGC人工智能专栏~神经网络…

【MATLAB第75期】#源码分享 | 基于MATLAB的不规则间隔数据插值实现时间序列数据扩充(更新中)

【MATLAB第75期】#源码分享 | 基于MATLAB的不规则间隔数据插值实现时间序列数据扩充 代码 %% 清空环境变量 warning off % 关闭报警信息 close all % 关闭开启的图窗 clear % 清空变量 clc % 清空命令行%%…

抽奖系统的设计与实现

1 绪论 随着人类社会步入21世纪,信息技术的飞速发展和社会信息化的不断提高&#xff0c;特别是进入网络信息时代&#xff0c;我们的工作越来越离不开计算机&#xff0c;这个时候就需要更好的运用现代化技术为各联系点服务&#xff0c;不断提高工作效率。计算机就充分体现了在这…

Tomcat修改配置文件

1.Tomcat启动乱码问题 1.1conf目录 说明&#xff1a;找到conf目录下logging.properties文件 1.2打开logging.properties文件 说明&#xff1a;将UTF-8修改成GBK 1.3.效果 2.端口冲突问题 2.1 conf目录 2.2打开 server.xml文件 2.3.修改端口 说明&#xff1a;port指的就是端…

使用node实现websocket

使用node实现websocket 什么是websocket websocket代表了Web应用程序通信方式的根本转变。不同于传统的HTTP请求响应周期&#xff0c;即客户端从服务器请求数据并等待响应&#xff0c;websocket在客户端和服务器之间建立一个持久的全双工连接。这意味着一旦建立了websocket&a…

LeetCode【4. 寻找两个正序数组的中位数】

快乐安康 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 public double findMedianSortedArrays(int[] nums1, int[] nums2) {if (nums1.length &…

如何实现 pdf 转 word

前言&#xff1a;最直接的方式 wps 充会员可以直接转&#xff0c;但是单纯为了 使用这个功能有没啥必要 pdf转word方法 在线转换wps转换其他收费转换方式 在线转换 介绍在线转换&#xff0c;虽然样式简陋但是可以转换成功&#xff0c;转换以后也没有失真 http://ssyr.mynatap…

linux安装sqoop

一 解压安装包 这里提供了网盘资源 链接: https://pan.baidu.com/s/1QkFqVnlvuOJ_aB2bjn-OKg?pwducsy 提取码: ucsy 这里有两个压缩包&#xff0c;sqoop-1.4.7.tar.gz是 sqoop 的安装包&#xff0c;另一个是我们需要里面的一些 jar 包 解压 安装包 tar -zxf ./sqoop-1.4.7.t…

LCP 01.猜数字

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;LCP 01. 猜数字 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 遍历比较即可。 解题代码&#xff1a; class Solution {public int game(int[] guess, int[] answer) {int res0;for(int …

1-FPGA硬件加速-YUV_YCbCr

这是对《基于Matlab与FPGA的图像处理教程》的学习笔记&#xff0c;代码和内容摘取自书中。 心得&#xff1a; 使用FPGA进行硬件加速的重点是消除或者减少浮点数运算&#xff0c;转换为定点运算&#xff0c;然后通过pipeline流水设计转为并行实现加速。 原理和方法 RGB与&…

使用原生的js实现分享功能,代码非常精简

分享一个原生的js实现移动端分享功能&#xff0c;希望大家喜欢。 兼容性&#xff1a; 实现代码&#xff1a; function share(){ if (!navigator.share) { alert("您当前浏览器不支持分享&#xff01;"); } else { navigator.share({title: {$title},text: {$introd…

Vue2面试题100问

Vue2面试题100问 Vue2面试题100问1.简述一下你对Vue的理解2.声明式和命令式编程概念的理解3.Vue 有哪些基本特征4.vue之防止页面加载时看到花括号解决方案有哪几种&#xff1f;5.Vue中v-for与v-if能否一起使用&#xff1f;6.vue中v-if与v-show的区别以及使用场景7.v-on可以监听…

Docker--未完结

一.Docker是干什么的 在没亲自使用过之前&#xff0c;再多的术语也仅仅是抽象&#xff0c;只有写的人或者使用过的人能看懂。 所以&#xff0c;作为新手来说&#xff0c;只要知道Docker是用于部署项目就够了&#xff0c;下面展示如何用Docker部署项目及Docker常用命令。 二、…

c++高精度乘法

在C中实现高精度乘法通常需要自己编写代码&#xff0c;因为C的内置数据类型&#xff08;如int、long、double&#xff09;有限制&#xff0c;无法表示非常大的整数精度。以下是一个简单的示例&#xff0c;演示如何在C中实现高精度乘法&#xff1a; #include <iostream> …

冠达管理:庄家最怕的8个方法?

在股票商场上&#xff0c;庄家总是短时刻内操控价格&#xff0c;并在一定的时刻内进出股市&#xff0c;以赚取巨额赢利。 假如想在股票商场上盈余&#xff0c;那么就必须站在庄家的对立面&#xff0c;把握一些防护和反击的办法。这里就来介绍一些庄家最怕的办法。 一、技能剖析…

【自学开发之旅】Flask-restful-Jinjia页面编写template-回顾(五)

restful是web编程里重要的概念 – 一种接口规范也是一种接口设计风格 设计接口&#xff1a; 要考虑&#xff1a;数据返回、接收数据的方式、url、方法 统一风格 rest–表现层状态转移 web–每一类数据–资源 资源通过http的动作来实现状态转移 GET、PUT、POST、DELETE path…

【第45届ICPC沈阳站J】Descent of Dragons(可持久化线段树)

题面 &#x1f517; &#xff08;提交&#xff1a;&#x1f517;&#xff0c;洛谷&#xff1a;&#x1f517;&#xff09; 有一个序列 { a n } \{a_n\} {an​}&#xff0c;初始时全为 0 0 0&#xff0c;有 q q q 次操作&#xff1a; 1 l r x &#xff1a;对所有 l ≤ i …

使用Docker构建轻量级Linux容器

Docker是一个开源的容器化平台&#xff0c;可以帮助用户快速创建、部署和管理应用程序的轻量级Linux容器。通过Docker&#xff0c;用户可以将应用程序及其所有依赖项打包成一个独立的容器镜像&#xff0c;并在各种环境中运行&#xff0c;无需担心环境差异和依赖冲突。下面将详细…

R语言分析糖尿病数据:多元线性模型、MANOVA、决策树、典型判别分析、HE图、Box's M检验可视化...

全文链接&#xff1a;https://tecdat.cn/?p33609 Reaven和Miller&#xff08;1979&#xff09;研究了145名非肥胖成年人的葡萄糖耐量和胰岛素血液化学指标之间的关系。他们使用斯坦福线性加速器中心的PRIM9系统将数据可视化为3D&#xff0c;并发现了一个奇特的图案&#xff0c…