力扣刷题-图论-岛屿类问题-集合实现(c++实现)

  • 我的老师:力扣链接这道题题解中最高赞的回答nettee,从这篇题解中我学到了dfs框架以及解决思路,并独立完成了该题解里的几道习题
  • 本人刷题的习惯是学会一个板子,然后之后的同类题都机械的用这个板子去做,最好不做创新,或许能给其他朋友提供一些规律性帮助,所以本blog把我各个题目的代码都放上来!

岛屿数量(简单)

岛屿数量

  • 这道是母题,放代码(后面的题目我一律按照这个板子去做)
class Solution {
public:int num=0;int numIslands(vector<vector<char>>& grid) {int rn = grid.size();    // 行数int cn = grid[0].size(); // 列数for (int r = 0; r < rn; r++) {for (int c = 0; c < cn; c++) {// 先标记if (grid[r][c] == '1') {num++;}dfs(grid, r, c);}}return num;}void dfs(vector<vector<char>>& grid, int r, int c) {if (!inArea(grid, r, c) || grid[r][c] != '1')return;grid[r][c]='2';//四面(上下左右)去dfsdfs(grid, r - 1, c );dfs(grid, r , c + 1);dfs(grid, r + 1, c );dfs(grid, r , c - 1);}bool inArea(vector<vector<char>>& grid, int r, int c) {return (0 <= r) && (r < grid.size()) && (0 <= c) &&(c < grid[0].size());}
};

岛屿周长(简单)

岛屿周长
在这里插入图片描述

  • 很容易分析出来,对岛屿点(1)去上下左右dfs,如果是0或者不在Area内,就可以周长+1,最后累计获得总周长,放代码:
class Solution {// 遍历上下左右,如果是陆地就不动,如果是海或者不在area内就+1// 总共只有一个岛屿public:int peri = 0;int islandPerimeter(vector<vector<int>>& grid) {int rn = grid.size();int cn = grid[0].size();for (int r = 0; r < rn; r++) {for (int c = 0; c < cn; c++) {// 如果是陆地if (grid[r][c] != 1) {continue;}// 如果是陆地才会dfs(grid, r, c);}}return peri;}void dfs(vector<vector<int>>& grid, int r, int c) {// 还要考虑grid==[2]的情况if (!inArea(grid, r, c) || grid[r][c] == 0) {peri++;return;}if (grid[r][c] == 2) {return;}grid[r][c] = 2;dfs(grid, r - 1, c);dfs(grid, r + 1, c);dfs(grid, r, c - 1);dfs(grid, r, c + 1);return;}bool inArea(vector<vector<int>>& grid, int r, int c) {return 0 <= r && r < grid.size() && 0 <= c && c < grid[0].size();}
};

岛屿的最大面积(中等)

岛屿的最大面积
这道题的思路也很明显,同理找到所有的岛屿,然后开一个新的变量maxs来存最大岛屿就OK,看代码:

  • 此处dfs有点不同,返回值为int,然后直接 把上下左右的dfs写在return里,大家看代码应该很好理解(其实上一题求周长也可以这样做,这里周长一道,面积一道,提供两种方案)
class Solution {
public:int maxs = 0;int s = 0;int maxAreaOfIsland(vector<vector<int>>& grid) {// 同理int rn = grid.size();int cn = grid[0].size();for (int r = 0; r < rn; r++) {for (int c = 0; c < cn; c++) {if (grid[r][c] != 1)continue;s = dfs(grid, r, c);maxs = s > maxs ? s : maxs;}}return maxs;}int dfs(vector<vector<int>>& grid, int r, int c) {if (!InArea(grid, r, c)) {return 0;}// 如果是海if (grid[r][c] != 1) {return 0;}grid[r][c] = 2;return 1 + dfs(grid, r - 1, c) + dfs(grid, r + 1, c) +dfs(grid, r, c - 1) + dfs(grid, r, c + 1);}bool InArea(vector<vector<int>>& grid, int r, int c) {return 0 <= r && r < grid.size() && 0 <= c && c < grid[0].size();}
};

最大人工岛(困难)

最大人工岛

  • 本题我一开始的思路是:遍历每个0点,然后赋值为1,再遍历该情况下的最大岛屿面积(类似上一题思路);再把该1变回0,看下一个变1的可能点;取所有情况的面积最大值——无奈空间超限!
  • 于是我看了题解,理解了以后又自己写,与官方题解的代码略有不同,更贴近我爱用的板子(与上面几道吻合)
  • 思路:
    • 先计算出每一个岛屿的面积(防止之后重复计算)——第一次双重循环
    • 第二次双重循环思路同理,把0变成1,看是否能连接一些岛屿
    • 已写明注释!
    • ps. 这份代码巧用vector< int > d = {0, -1, 0, 1, 0};,大家可以好好看下,和dfs(grid,r-1,s)等上下左右遍历异曲同工,适用于减少递归,代码更清晰
class Solution {
public:int t = 0;vector<int> square;//存储每一个岛屿的面积vector<int> d = {0, -1, 0, 1, 0};int zero=0;//是否有0可以变1,如果没有的话就说明给的vector是全1,直接返回总面积!)int largestIsland(vector<vector<int>>& grid) {int n = grid.size();// 先计算每个岛屿的面积吧vector<vector<int>> used(n,vector<int>(n));square.resize(n * n + 2, 0);//这行相当于是一个经验吧,//否则报错(看我上一篇博客)int r = 0, c = 0, x1 = 0, y1 = 0, s = 0, maxs = 0;for (r = 0; r < n; r++) {for (c = 0; c < n; c++) {// 如果就是大陆if (grid[r][c] == 1) {t++;//注意,这里我本来想让t从0开始的,后来发现不行,//因为如果没有标记的岛屿也是0,之后用t来索引的时候会出错square[t] = dfs(grid, r, c, t, used);//这里得到岛屿面积}}}unordered_set<int> connected;// 现在完成面积的计算for (r = 0; r < n; r++) {for (c = 0; c < n; c++) {if (grid[r][c] == 0) {//说明该vector并非全1zero=1;//面积s = 1;connected.clear();// 尝试变成1,看着附近的areafor (int i = 0; i < 4; i++) {x1 = r + d[i];y1 = c + d[i + 1];if (InArea(grid,x1,y1)&&used[x1][y1] != 0 &&connected.count(used[x1][y1]) == 0) {// s面积加上来s += square[used[x1][y1]];connected.insert(used[x1][y1]);}}// 该情况的面积计算完毕maxs = max(s, maxs);}}}//如果是全1的话就直接返回square[1]return zero==0?square[1]:maxs;}
//dfs功效纯粹为了计算每个岛屿的面积!int dfs(vector<vector<int>>& grid, int r, int c, int t,vector<vector<int>>& used) {if (!InArea(grid, r, c) || used[r][c] != 0 || grid[r][c] != 1)return 0;used[r][c] = t;int x1, y1, s = 1;// 已经遍历过就标记为2grid[r][c] = 2;for (int i = 0; i < 4; i++) {x1 = r + d[i], y1 = c + d[i + 1];s += dfs(grid, x1, y1, t, used);}return s;}bool InArea(vector<vector<int>>& grid, int r, int c) {return 0 <= r && r < grid.size() && 0 <= c && c < grid[0].size();}
};

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

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

相关文章

Mybatis(三) 查询不同数据封装的方式

实体类&#xff1a; 数据库&#xff1a; 1、查询一个实体类对象 /** * 根据用户id查询用户信息* param id * return */User getUserById(Param("id") int id);<select id"getUserById" resultType"User">select * from t_user where id …

创维汽车滁州永通体验中心开业仪式暨超充车型区域上市会圆满成功

2024年7月20日&#xff0c;创维汽车滁州永通体验中心盛大开业&#xff0c;当日&#xff0c;创维汽车市场部经理周世鹏、安徽大区总监王大明等领导参加本次开业盛典&#xff0c;共同见证创维汽车滁州永通体验中心成功落地。 2021年&#xff0c;新能源乘用车高速发展&#xff0c;…

MATLAB基础:数组及其数学运算

今天我们继续学习MATLAB中的数组 我们在学习MATLAB时了解到&#xff0c;MATLAB作者秉持着“万物皆可矩阵”的思想企图将数学甚至世间万物使用矩阵表示出来&#xff0c;而矩阵的处理&#xff0c;自然成了这门语言的重中之重。 数组基础 在MATLAB中&#xff0c;数组是一个基本…

Beam Search 原理详解

文章目录 1. 前言2. 原理3. 举例4. 参考 1. 前言 Beam Search 是一种启发式图搜索算法&#xff0c;用于在图或树的搜索过程中寻找最有可能的路径。它常用于自然语言处理&#xff08;NLP&#xff09;中的序列生成任务&#xff0c;如机器翻译、语音识别和文本生成等。与穷举搜索…

网络三剑客之awk

目录 一、awk理论简述 1.1 awk概述 1.2 工作原理 1.3 工作流程 1.3.1 运行模式 1.3.2 执行流程 1.3.3 awk程序结构 1.4 基本语法 1.4.1 命令格式 二、awk操作显示 2.1 基础显示 注&#xff1a;扩展生产案例&#xff08;网卡ip、流量&#xff09; 2.2 BEGIN END 运…

AI大模型写的高考作文,你觉得怎么样?

下方为2024年高考新课标I卷语文作文题目&#xff0c;接下来将使用Chatgpt、文心一言、讯飞星火等众多AI大模型来写这篇高考作文 Chatgpt 标题&#xff1a;问题的演变与思考 随着互联网和人工智能技术的飞速发展&#xff0c;我们获得信息的方式和速度发生了前所未有的变化。曾经…

Spring-Aop源码解析(二)

书接上文&#xff0c;上文说到&#xff0c;specificInterceptors 不为空则执行createProxy方法创建代理对象&#xff0c;即下图的createProxy方法开始执行&#xff0c;生成代理对象&#xff0c;生成代理对象有两种方式&#xff0c;JDK和CGLIB。 createAopProxy就是决定使用哪…

减轻幻觉新SOTA,7B模型自迭代训练效果超越GPT-4,上海AI lab发布

LLMs在回答各种复杂问题时&#xff0c;有时会“胡言乱语”&#xff0c;产生所谓的幻觉。解决这一问题的初始步骤就是创建高质量幻觉数据集训练模型以帮助检测、缓解幻觉。 但现有的幻觉标注数据集&#xff0c;因为领域窄、数量少&#xff0c;加上制作成本高、标注人员水平不一…

介绍一下TCP/IP 模型和 OSI 模型的区别

OSI 模型是由国际标准化组织制定的一个用于计算机或通信系统间互联的标准体系&#xff0c;一共有七层&#xff0c;由上而下分别为应用层&#xff0c;表示层&#xff0c;会话层&#xff0c;传输层&#xff0c;网络层&#xff0c;数据链路层和物理层&#xff0c;虽然 OSI 模型理论…

微信公众平台无限回调系统 /user/ajax.php SQL注入漏洞复现

0x01 产品简介 微信公众平台无限回调系统是一种旨在提升企业客户服务体验和运营效率的工具。该系统通过一系列智能化和自动化的功能,帮助企业与用户之间建立更加便捷、高效的沟通桥梁。 0x02 漏洞概述 微信公众平台无限回调系统 /user/ajax.php 接口存在SQL注入漏洞,未经身…

k8s多集群管理工具kubecm

文章目录 一、概述二、安装1、官网链接2、各平台安装2.1、MacOS2.2、Linux2.3、Windows 三、实例1、验证2、配置kubecm自动补全&#xff08;选做&#xff09;2.1、Bash2.2、Zsh2.3、fish2.4、PowerShell 3、创建存放kubeconfig文件的目录4、添加到 $HOME/.kube/config4.1、kube…

win10系统通过docker部署pytorch的cpu环境_中文地址命名实体识别案例

命名实体有关文章参考这篇文章 中文地址命名实体识别训练和预测 其它docker部署类似文章参考 分布式爬虫管理平台gerapy通过docker部署scrapyd来添加主机(四) 背景 通过win10系统通过docker来部署,可以方便的在其它没有python环境的电脑上部署python项目,下面所有操作基…

【网络安全】通过导入功能将权限提升至管理员

未经许可&#xff0c;不得转载。 文章目录 正文 正文 一款学习型 Web 应用&#xff0c;具有多个角色&#xff0c;其中两个相关角色是admin和student。 管理员拥有完全访问权限&#xff0c;而学生拥有有限的访问权限。管理面板中的一项功能允许管理员通过 CSV 方便地导入用户&…

EXCEL自动公式计算始终为0

如果你的数据单元格的左上角存在绿色的三角小箭头&#xff0c;那么就会造成这种问题&#xff1a; 你的数字是以文本形式存入的单元格 解决办法&#xff1a; 选中数据列&#xff0c;数据->分列 直接选择完成 此时就可以进行公式计算了

嵌入式人工智能(26-基于树莓派4B的声音传感器)

发声体产生的振动在空气或其他物质中的传播叫作声波。声波可以借助各种介质向四面八方传播,根据频率的不同&#xff0c;可分为普通的声波(人耳能听到的&#xff0c;频率为20~20000Hz)和超声波(人耳不能听到,频率大于20000Hz)。声波传感器可以检测环境中的声波信号&#xff0c;根…

Linux进程——环境变量之二

文章目录 环境变量查看环境变量获取环境变量main()的第三个参数本地变量全局环境变量内建命令与常规命令 环境变量 查看环境变量 在上一篇文章中我们只说了查看某个环境变量的值&#xff0c;那么如何查看所有的环境变量呢 使用指令env即可 例如 这里我们也不需要全部记住&a…

WPF MVVM框架:CommunityToolkit.Mvvm包使用介绍

最近在需要使用MVVM框架的时候才发现MvvmLight作者宣布停止更新了&#xff0c;有点可惜。 原作者推荐使用CommunityToolkit.Mvvm包&#xff0c;所以这里做一个CommunityToolkit.Mvvm包使用的全面的总结。 开发环境&#xff1a; Visual Studio 2019Windows 10 1903CommunityTo…

海山数据库(He3DB)性能优化方案解析

前端优化是一个永恒的话题&#xff0c;每个前端开发者都希望自己的页面能够快速加载&#xff0c;给用户良好的体验。但往往事与愿违。因此&#xff0c;本文从编码优化、构建优化、部署优化三方面入手进行web页面性能优化。 1. 编码优化 1.1. Css优化 1.1.1. 合理使用css选择…

vue 实战 区域内小组件元素拖拽 示例

<template><div><el-button type"primary" click"showDialog true">快捷布局</el-button><el-dialog title"快捷布局配置" :visible.sync"showDialog"><el-row :gutter"20"><el-co…

全方位数据管理:一站式爬虫服务解决方案

摘要 面对互联网信息爆炸的时代&#xff0c;如何高效地收集、整理并分析海量数据&#xff0c;成为企业与开发者面临的一大挑战。本文将深入探讨一站式爬虫服务解决方案&#xff0c;揭示如何通过全方位数据管理策略&#xff0c;助力企业轻松驾驭大数据海洋&#xff0c;实现数据…