算法|图论 4

LeetCode 827.最大人工岛

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

题目描述:给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。

返回执行此操作后,grid 中最大的岛屿面积是多少?

岛屿 由一组上、下、左、右四个方向相连的 1 形成。

解题思路(深度优先遍历):

首先,通过深度优先遍历,将所有岛屿,按片为单位全部都标记下来,也就是同一片岛屿的编号相同,不同岛屿的编号不同。我们用unordered_map记录下来这一片片岛屿的面积。

下一步,直接通过遍历所有的海洋也就是标号为0的点,去看其四周的岛屿能不能链接起来,如果可以,我们就将对应岛屿的编号添加到unordered_set中去,并将对应的岛屿值相加到count中,再和result对比,取最大值即可。

class Solution {
public:int count;//count用来记录当前这片岛屿的面积int dir[4][2] = {0,1,1,0,-1,0,0,-1};//mark标记岛屿编号void dfs(vector<vector<int>> &grid,vector<vector<bool>> &visited,int x,int y,int mark){if(visited[x][y] || grid[x][y] == 0) return;visited[x][y] = true;grid[x][y] = mark;//标记岛屿标号count++;//当前岛屿面积加一for(int i=0;i<4;i++){int nextx = dir[i][0] + x;int nexty = dir[i][1] + y;if(nextx < 0 || nexty < 0 || nextx >= grid.size() || nexty >= grid[0].size())continue;dfs(grid,visited,nextx,nexty,mark);}}int largestIsland(vector<vector<int>>& grid) {int n = grid.size(),m = grid[0].size();vector<vector<bool>> visited = vector<vector<bool>> (n,vector<bool>(m,false));//记录岛屿编号对应的岛屿面积,key是岛屿的标号,value是这片岛屿的面积。//一片岛屿的标号都是一样的unordered_map<int,int> gridNum;int mark = 2;//标号从2开始bool isAllGrid = true;//标记是否全是岛屿,全是岛屿我们直接返回m*n即可for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(grid[i][j] == 0) isAllGrid = false;//不全是岛屿if(!visited[i][j] && grid[i][j] == 1){count = 0;//清空count,防止多次记录同一片岛屿dfs(grid,visited,i,j,mark);gridNum[mark] = count;//将对应的键值对存储进mapmark++;//标号自增,防止标号重复}}}if (isAllGrid) return n * m; //全是岛屿直接返回int result = 0; // 记录最后结果unordered_set<int> visitedGrid; // 标记这次的0链接过的岛屿for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {int count = 1; // 记录连接之后的岛屿数量visitedGrid.clear(); // 每次使用时清空。if (grid[i][j] == 0) {for (int k = 0; k < 4; k++) {int neari = i + dir[k][1]; // 计算相邻坐标int nearj = j + dir[k][0];if (neari < 0 || neari >= grid.size() || nearj < 0 || nearj >= grid[0].size()) continue;//count是计数,看这个岛屿对应的mark(标记)有没有被添加进来,//没有则代表这片岛屿没有被链接过。因为只要链接我们就去取其中这片岛屿//的值,只要有一个链接了,别的全都不能再链接了。if (visitedGrid.count(grid[neari][nearj])) continue; // 添加过的岛屿不要重复添加// 把相邻四面的岛屿数量加起来count += gridNum[grid[neari][nearj]];visitedGrid.insert(grid[neari][nearj]); // 标记该岛屿已经添加过}}result = max(result, count);}}return result;}
};

总结:

  • 深搜和广搜的问题,广搜里面写的那个思路很清奇,还是得多看题目的提示,可以减少一点时间和空间的损耗。

LeetCode 127- 单词接龙

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

题目描述:字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> ... -> sk:

  • 每一对相邻的单词只差一个字母。
  • 对于 1 <= i <= k 时,每个 si 都在 wordList 中。注意, beginWord 不需要在 wordList 中。
  • sk == endWord

给你两个单词 beginWord 和 endWord 和一个字典 wordList ,返回 beginWordendWord最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0 。

解题思路

首先明确本题题意,意思就是我们需要从字典中找到begin 到 end 的最短路径,每次只能更换一个字母。

本题思路是广度优先遍历,首先我们将begin和step=1入队,并不断取出队首元素,将队首元素中每个字母都进行从'a' - 'z' 的替换。如果能在set中找到替换后的元素,说明可以走这一步,我们就将其入队,并且将set中对应的元素删除,防止出现反复走这一步的情况。并且替换一个字母后,我们再将其还原看替换其他字母能不能行。直到遇到队首元素为end的情况,直接返回step即可。

class Solution {
public:int ladderLength(string beginWord, string endWord, vector<string>& wordList) {//开始我们将所有单词都记录到set中,s用来记录字典中的单词是否已经用过,用过则直接删除unordered_set<string> s;//符号 & 表明 i 是一个引用变量,能让接下来的循环可以修改s中的内容for(auto &i : wordList)s.insert(i);//队列q用来表示当前到达当前字符需要的步数queue<pair<string,int>> q;//压入开始词和1q.push({beginWord,1});//tmp为每次我们要换的单词string tmp;//step为每次的步数int step;while(!q.empty()){//若队头元素就是最终单词,则直接返回对应的步数if(q.front().first == endWord){return (q.front().second);}//取出队头元素tmp = q.front().first;step = q.front().second;q.pop();//开始尝试,ch表示当前取出来字符串的每个字符。char ch;//这里是将当前字符串的每个字符都试试看看替换成a-z中的字符能否在字典中找到。//能找到我们就入队,并且还原,因为每次只修改一个字符,如果不能,则直接还原。for(int i=0;i<tmp.length();i++){ch = tmp[i];for(char c='a';c<='z';c++){if(ch == c) continue;tmp[i] = c;if(s.find(tmp) != s.end()){q.push({tmp,step+1});s.erase(tmp);}tmp[i] = ch;}}}return 0;}
};

总结:

  • 广度优先,但不知道如何模拟广度,原来就是替换字母。还是多练习,多看思路才行。

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

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

相关文章

自动驾驶中的决策规划

参考: 【干货篇】轻舟智航&#xff1a;自动驾驶中的决策规划技术&#xff08;附视频回放 PPT 下载&#xff09; - AIQ 如图所示, 各模块介绍 定位模块主要负责解答的问题是“车现在在哪里”&#xff0c;是在道路上还是在路口&#xff0c;是在高架桥上还是在停车场里。 感知…

python随手小练

题目&#xff1a; 使用python做一个简单的英雄联盟商城登录界面 具体操作&#xff1a; print("英雄联盟商城登录界面") print("~ * "*15 "~") #找其规律 a "1、用户登录" b "2、新用户注册" c "3、退出系统&quo…

jq弹窗拖动改变宽高

预览效果 <div classtishiMask><div class"tishiEm"><div id"coor"></div><div class"topNew ismove"><span class"ismove">提示</span><p onclick"closeTishi()"></p&…

计算机组成原理——基础入门总结(二)

上一期的路径&#xff1a;基础入门总结&#xff08;一&#xff09; 目录 一.输入输出系统和IO控制方式 二.存储系统的基本概念 三.cache的基本概念和原理 四.CPU的功能和基本结构 五.总线概述 一.输入输出系统和IO控制方式 IO设备又可以被统一称为外部设备~ IO接口&…

Python 根据身高体重计算体质(BMI)指数

""" 根据身高体重计算体质(BMI)指数知识点&#xff1a;1、计算公式&#xff1a;体质指数(BMI) 体重(KG) / (身高(M) * 身高(M))2、变量类型转换3、运算符幂**&#xff0c;例如&#xff1a;3 ** 2 9 <> 3 * 34、更多的运用请参考&#xff1a;https://blo…

【2023全网最全最火】Selenium WebDriver教程(建议收藏)

在本教程中&#xff0c;我将向您介绍 Selenium Webdriver&#xff0c;它是当今市场上使用最广泛的自动化测试框架。它是开源的&#xff0c;可与所有著名的编程语言&#xff08;如Java、Python、C&#xff03;、Ruby、Perl等&#xff09;一起使用&#xff0c;以实现浏览器活动的…

【Hierarchical Coverage Path Planning in Complex 3D Environments】

Hierarchical Coverage Path Planning in Complex 3D Environments 复杂三维环境下的分层覆盖路径规划 视点采样全局TSP 算法分两层&#xff0c;一层高级一层低级&#xff1a; 高层算法将环境分离多个子空间&#xff0c;如果给定体积中有大量的结构&#xff0c;则空间会进一步细…

为什么要选择Spring cloud Sentinel

为什么要选择Spring cloud Sentinel &#x1f34e;对比Hystrix&#x1f342;雪崩问题及解决方案&#x1f342;雪崩问题&#x1f342;.超时处理&#x1f342;仓壁模式&#x1f342;断路器&#x1f342;限流&#x1f342;总结 &#x1f34e;对比Hystrix 在SpringCloud当中支持多…

美创科技参编《数字政府建设与发展研究报告(2023)》 正式发布

9月14日&#xff0c;中国信息通信研究院云计算与大数据研究所牵头编制的《数字政府建设与发展研究报告&#xff08;2023&#xff09;》正式发布。 美创科技结合在政务数据安全领域的丰富实践经验&#xff0c;参与报告编写。 《数字政府建设与发展研究报告》 以“技术、业务、数…

ARM 汇编指令作业(求公约数、for循环实现1-100之间和、从SVC模式切换到user模式简单写法)

1、求两个数最大公约数 .text .globl _start_start:mov r0, #9mov r1, #15 Loop: 循环cmp r0,r1 比较r0和r1的大小beq stop 当r0和r1相等时&#xff0c;跳到stop标签subhi r0,r0,r1 r0-r1>0 时&#xff0c;证明r0>r1,将r0-r1的值赋给r0&…

【Web3】创作者经济

这里写目录标题 创作者经济是什么&#xff1f;创作者从 Web 1.0 到 Web 3.0 的演进Web 1.0 企业 1985Web 2.0 平台的创作者 2004Web 3.0 创造者 / 所有者 2021 粉丝经济的转变 & 四个阶段创作者经济的四个阶段 创作者经济 Web 3.0 工具创作者经济生态全景图OpenSeaFoundati…

近年来国内室内定位领域硕士论文选题的现状与趋势

目录 一、前言 二、选题的目的和意义 三、选题现状分析 四、选题趋势分析 一、前言 本博文采用了图表统计法分析了近5年来100余篇高被引室内定位领域硕士论文选题的现状&#xff0c;并从选题现状中得出了该领域选题的大致趋势。本文还通过分析该领域硕士毕业论文选题的现…

数字孪生技术如何提升工厂生产效率?

数字孪生技术是一项引领工业界数字化转型的创新力量。随着工业4.0时代的到来&#xff0c;制造业正经历着巨大的变革&#xff0c;数字孪生技术在这个变革中发挥了关键作用。它不仅仅是一种技术&#xff0c;更是一种理念&#xff0c;将现实世界与数字世界相结合&#xff0c;为工厂…

C++真的是 C加加

&#x1f4dd;个人主页&#xff1a;夏目浅石. &#x1f4cc;博客专栏&#xff1a;C的故事 &#x1f3e0;学习社区&#xff1a;夏目友人帐. 文章目录 前言Ⅰ. 函数重载0x00 重载规则0x01 函数重载的原理名字修饰 Ⅱ. 引用0x00 引用的概念0x01 引用和指针区分0x03 引用的本质0x04…

U盘有病毒插上电脑会感染吗?了解下U盘的病毒传播机制

U盘作为一种常见的移动存储设备&#xff0c;我们会经常使用它来传输和存储重要的文件。然而&#xff0c;有时可能会遇到文件被当作病毒误删除的情况&#xff0c;这给我们带来了不便和焦虑。好在&#xff0c;这里将向您介绍一些简单而有效的方法&#xff0c;帮助您恢复被误删除的…

vite自定义打包路径

修改vite.config.js 增加: build: { outDir:‘…/out’ }, base: ‘./’, 例子: // https://vitejs.dev/config/ export default defineConfig({plugins: [vue(),WindiCSS()],build: {outDir:../out},base: ./,server: {host:0.0.0.0,// https:{// cert: fs.readFi…

python装13的一些写法

一些当你离职后&#xff0c;让老板狂拍大腿的代码 1. any(** in ** for ** in **) 判断某个集合元素&#xff0c;是否包含某个/某些元素 代码&#xff1a; if __name__ __main__:# 判断 list1 中是否包含某个/某些元素list1 [1,2,3,4]a any(x in [5,4] for x in list1) 输…

buuctf-[网鼎杯 2020 朱雀组]phpweb

1.打开网站&#xff0c;吓我一跳 2.查看源代码&#xff0c;主要看到timezone&#xff0c;然后这个页面是五秒就会刷新一次 一开始去搜了这个&#xff0c;但是没什么用 3.使用bp抓包 会发现有两个参数&#xff0c;应该是用func来执行p 4.修改func和p file_get_contents&#…

pom的配置策略

dependencyManagement和dependencies区别和联系 参考&#xff1a;https://blog.csdn.net/Sunshineoe/article/details/121083505 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:…

深入了解ln命令:创建硬链接和符号链接的实用指南

文章目录 1. 引言1.1 关于ln命令1.2 ln命令的作用和用途 2. 基本用法2.1 创建硬链接2.2 创建符号链接2.3 区别硬链接和符号链接 3. 操作示例3.1 创建硬链接的示例3.2 创建符号链接的示例3.3 查看链接信息 4. 注意事项和常见问题4.1 文件路径4.2 软链接的相对路径4.3 软链接的更…