代码随想录算法训练营第五十九天 | 110.字符串接龙、105.有向图的完全可达性、106.岛屿的周长、复习

110.字符串接龙

题目链接:https://kamacoder.com/problempage.php?pid=1183
文档讲解:https://programmercarl.com/kamacoder/0110.%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%8E%A5%E9%BE%99.html

思路

本题只需要求出最短路径的长度就可以了,不用找出具体路径。所以这道题要解决两个问题:

  • 图中的线是如何连在一起的
  • 起点和终点的最短路径长度

首先题目中并没有给出点与点之间的连线,而是要我们自己去连,条件是字符只能差一个。所以判断点与点之间的关系,需要判断是不是差一个字符,如果差一个字符,那就是有链接。
然后就是求起点和终点的最短路径长度,这里无向图求最短路,广搜最为合适,广搜只要搜到了终点,那么一定是最短的路径。因为广搜就是以起点中心向四周扩散的搜索。

本题如果用深搜,会比较麻烦,要在到达终点的不同路径中选则一条最短路。 而广搜只要达到终点,一定是最短路。另外需要有一个注意点:

  • 本题是一个无向图,需要用标记位,标记着节点是否走过,否则就会死循环。
  • 使用set来检查字符串是否出现在字符串集合里更快一些。

代码

import java.util.*;class Main {public static void main (String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();String beginStr = in.next();String endStr = in.next();Set<String> strList = new HashSet<>();for (int i = 0; i < n; i++) strList.add(in.next());// 记录strList中的字符串是否被访问过,并记录路径长度HashMap<String, Integer> map = new HashMap<>();Queue<String> queue = new LinkedList<>();queue.offer(beginStr);map.put(beginStr, 1);while (!queue.isEmpty()) {String word = queue.poll();int pathLen = map.get(word);for (int i = 0; i < word.length(); i++) {char[] newWordCh = word.toCharArray();for (char j = 'a'; j <= 'z'; j++) {newWordCh[i] = j;String newWord = new String(newWordCh);if (newWord.equals(endStr)) {System.out.println(pathLen + 1);return;} if (strList.contains(newWord) && !map.containsKey(newWord)) { // 字典中存在且未被访问queue.offer(newWord);map.put(newWord, pathLen + 1);}}}}System.out.println(0);}
}

105.有向图的完全可达性

题目链接:https://kamacoder.com/problempage.php?pid=1177
文档讲解:https://programmercarl.com/kamacoder/0105.%E6%9C%89%E5%90%91%E5%9B%BE%E7%9A%84%E5%AE%8C%E5…

思路

深搜三部曲:
1、确认递归函数,参数
需要知道当前我们拿到的key,以至于去下一个节点。同时还需要一个数组,用来记录我们都走过了哪些节点,这样好知道最后有没有把所有节点都遍历的,可以定义一个一维数组。
2、确认终止条件
遍历的时候,什么时候终止呢?这里有一个很重要的逻辑,就是在递归中,我们是处理当前访问的节点,还是处理下一个要访问的节点。如果是处理当前访问节点,则在递归开始时判断当前节点是否处理过,如果处理过就return。如果是处理下一个要访问的节点,需要判断下一个节点是否被访问过,如果被访问,则不继续dfs。
3、处理目前搜索节点出发的路径
visited数组来记录访问过的节点,该节点默认数组里元素都是false,把元素标记为true就是处理本节点了。

代码

import java.util.*;
class Main{static int[][] grid;static int n, k;static boolean[] visited;public static void main (String[] args) {Scanner in = new Scanner(System.in);n = in.nextInt();k = in.nextInt();grid = new int[n + 1][n + 1];visited = new boolean[n + 1];for (int i = 0; i < k; i++) {int tmp1 = in.nextInt(), tmp2 = in.nextInt();grid[tmp1][tmp2] = 1;}visited[1] = true;dfs(1);for (int i = 1; i <= n; i++) {if (!visited[i]) {System.out.println(-1);return;}}System.out.println(1);}public static void dfs(int i) {// 处理下一个节点 for (int j = 1; j <= n; j++) {if (!visited[j] && grid[i][j] == 1) {visited[j] = true;dfs(j);}}}
}

106.岛屿的周长

题目链接:https://kamacoder.com/problempage.php?pid=1178
文档讲解:https://programmercarl.com/kamacoder/0106.%E5%B2%9B%E5%B1%BF%E7%9A%84%E5%91%A8%E9%95%BF.html

思路

  • 解法一:用dfs或bfs,找到一块水,就等于一条边长;或者一条边出界,也算是一条边长。好吧,果然惯性思维了。
  • 解法二:通过遍历二维数组,遍历每一个空格,遇到岛屿则计算其上下左右的空格情况。如果该陆地上下左右的空格是有水域,则说明是一条边;如果该陆地上下左右的空格出界了,则说明是一条边。
  • 解法三:岛屿数 result = 岛屿数量 * 4 - cover * 2;,找到陆地后,分别统计该陆地上边和左边是否相邻陆地。不统计右边和下边,防止重复。

代码

解法一:dfs法

import java.util.*;class Main {static int n, m, count = 0;static int[][] grid;static boolean[][] visitied;static int[][] dir = {{1, 0}, {0, 1}, {0, -1}, {-1, 0}};public static void main (String[] args) {Scanner in = new Scanner(System.in);n = in.nextInt();m = in.nextInt();grid = new int[n][m];visitied = new boolean[n][m];for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {grid[i][j] = in.nextInt();}}for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (!visitied[i][j] && grid[i][j] == 1) {visitied[i][j] = true;dfs(i, j);}}}System.out.println(count);}public static void dfs(int x, int y) {for (int i = 0; i < 4; i++) {int nextX = x + dir[i][0], nextY = y + dir[i][1];if (nextX < 0 || nextX >= n || nextY < 0 || nextY >= m) {count++;continue;}if (grid[nextX][nextY] == 0) count++;if (!visitied[nextX][nextY] && grid[nextX][nextY] == 1) {visitied[nextX][nextY] = true;dfs(nextX, nextY);}}}
}

解法二:遍历数组

import java.util.*;class Main {static int n, m, count = 0;static int[][] grid;static int[][] dir = {{1, 0}, {0, 1}, {0, -1}, {-1, 0}};public static void main (String[] args) {Scanner in = new Scanner(System.in);n = in.nextInt();m = in.nextInt();grid = new int[n][m];for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {grid[i][j] = in.nextInt();}}for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (grid[i][j] == 1) {for (int k = 0; k < 4; k++) {int x = i + dir[k][0], y = j + dir[k][1];if (x < 0 || x >= n || y < 0 || y >= m || grid[x][y] == 0) count++;}}}}System.out.println(count);}
}

解法三

import java.util.*;class Main {static int n, m;static int[][] grid;public static void main (String[] args) {Scanner in = new Scanner(System.in);n = in.nextInt();m = in.nextInt();grid = new int[n][m];for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {grid[i][j] = in.nextInt();}}int sum = 0, cover = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (grid[i][j] == 1) {sum++;if (i - 1 >= 0 && grid[i - 1][j] == 1) cover++;if (j - 1 >= 0 && grid[i][j - 1] == 1) cover++;}}}System.out.println(sum * 4 - cover * 2);}
}

复习二叉树

226.翻转二叉树
101. 对称二叉树
104.二叉树的最大深度
111.二叉树的最小深度

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

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

相关文章

使用 Qt 实现自定义拖动窗口

文章目录 如何在 Qt 中实现无标题栏窗口的拖动准备工作创建自定义窗口类使用 QDialog 实现拖动功能详细解释代码行解释 小结 如何在 Qt 中实现无标题栏窗口的拖动 在许多桌面应用程序中&#xff0c;我们经常需要自定义窗口外观&#xff0c;包括去掉标题栏&#xff0c;使窗口看…

SQL Server端口配置指南:最佳实践与技巧

1. 引言 SQL Server通常使用默认端口1433进行通信。为了提高安全性和性能&#xff0c;正确配置SQL Server的端口非常重要。本指南将帮助您了解如何配置和优化SQL Server的端口设置&#xff0c;以满足不同环境和需求。 2. 端口配置基础 2.1 默认端口 SQL Server的默认端口是…

LabVIEW幅频特性测试系统

使用LabVIEW软件开发的幅频特性测试系统。该系统整合了Agilent 83732B信号源与Agilent 8563EC频谱仪&#xff0c;通过LabVIEW编程实现自动控制和数据处理&#xff0c;提供了成本效益高、操作简便的解决方案&#xff0c;有效替代了昂贵的专用仪器&#xff0c;提高了测试效率和设…

一款EF Core下高性能、轻量级针对分表分库读写分离的解决方案

ShardingCore项目介绍 ShardingCore是一款开源、简单易用、高性能、普适性&#xff0c;针对EF Core生态下的分表分库的扩展解决方案&#xff0c;支持EF Core2的所有版本&#xff0c;支持EF Core2的所有数据库、支持自定义路由、动态路由、高性能分页、读写分离的一款EF Core拓展…

华为云生态和快速入门

华为云生态 新技术催生新物种&#xff0c;新物种推动新生态 数字技术催生各类运营商去重塑并颠覆各行业的商业模式 从业务层面看&#xff0c;企业始终如一的目标是业务增长和持续盈利&#xff0c;围绕这些目标衍生出提质、增效、降本、安全、创新和合规的业务诉求&#xff0c…

本迪戈和阿德莱德银行与MongoDB合作, 利用生成式AI对银行核心技术进行现代化改造

MongoDB公司&#xff08;纳斯达克股票代码&#xff1a;MDB&#xff09;近日宣布与本迪戈和阿德莱德银行 (Bendigo and Adelaide Bank&#xff0c;澳大利亚证券交易所股票代码&#xff1a;BEN&#xff09;建立合作伙伴关系。 本迪戈和阿德莱德银行将使用MongoDB Atlas对其银行核…

【PTGui、Pano2VR6、UE4】VR全景拍摄及漫游交互制作操作实例(更新中)

一、基本思路 首先进行VR全景拍摄&#xff0c;获取高质量的全景图像&#xff1b;然后使用PTGui进行图像拼接&#xff0c;确保图像的连续性与准确性&#xff1b;接着利用Pano2VR6进行VR漫游的制作&#xff0c;添加交互元素与多媒体内容&#xff1b;最后进行作品的调试与优化&am…

条件筛选1-4题(30 天 Pandas 挑战)

条件筛选 1. 相关知识点1.1 query条件或查询1.2 query条件与查询1.3 存在查询及列名修改1.4 条件查询&#xff0c;相等1.5 删除重复值1.6 排序 2. 题目2.1 大的国家2.2 可回收且低脂的产品2.3 从不订购的客户2.4 文章浏览 I 1. 相关知识点 1.1 query条件或查询 # |或 world.q…

三星组件新的HBM开发团队加速HBM研发

为应对人工智能(AI)市场扩张带来的对高性能存储解决方案需求的增长&#xff0c;三星电子在其设备解决方案(DS)部门内部成立了全新的“HBM开发团队”&#xff0c;旨在提升其在高带宽存储器(HBM)领域的竞争力。根据Business Korea的最新报告&#xff0c;该团队将专注于推进HBM3、…

CUDA编程基础

文章目录 1、GPU介绍2、CUDA程序进行编译3、CUDA线程模型3.1、一维网格一维线程块3.2、二维网格二维线程块3.3、三维网格三维线程块3.3、不同组合形式 4、nvcc编译流程5、CUDA程序基本架构6、错误检测函数6.1、运行时API错误代码6.2、检查核函数 7、CUDA记时7.1、记时代码7.2、…

期货量化交易:探索金融投资的新领域

在当今快速发展的金融市场中&#xff0c;期货量化交易作为一种新兴的投资策略&#xff0c;正逐渐受到投资者的关注。本文将深入探讨期货量化交易的概念、优势、风险以及其在现代投资组合中的作用&#xff0c;旨在为广大读者提供一个全面而深入的视角。 期货市场概览 期货市场…

Google Earth Engine(GEE)——控制台ui.Textbox复制你想要的textbox

结果 函数: ui.Textbox(placeholder, value, onChange, disabled, style) A textbox that enables the user to input text information. Arguments: placeholder (String, optional): The placeholder text to display when the textbox is empty. Defaults to none. …

VBA语言専攻T3学员领取资料通知0706

T3学员领取资料通知0706 各位学员∶本周MF系列VBA技术资料增加641-645讲&#xff0c;T3学员看到通知后请免费领取,领取时间7月5日晚上19:00-7月6日晚上19:00。本次增加内容&#xff1a; MF641:前个窗体组合框选项联动下个组合框 MF642:工作表中数据选项联动下个数据验证 MF…

技术驱动旅游创新!深度解析景区导览小程序的地图渲染与AR导航技术

随着现代生活节奏的加快&#xff0c;人们在外出旅游时更倾向于轻便出行&#xff0c;携带导览地图已成为过去。然而&#xff0c;面对景区广阔的面积和众多景点&#xff0c;游客常常感到迷茫&#xff0c;难以快速定位到自己所需的地点。景区导览小程序让游客只需搜索景区名称&…

人工智能系列-NumPy(二)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 链接数组 anp.array([[1,2],[3,4]]) print(第一个数组&#xff1a;) print(a) print(\n) bnp.array([[5,6],[7,8]]) print(第二个数组&#xff1a;) print(b) print(\n) print…

zigbee笔记:六、看门狗定时器(Watch Dog)

一、看门狗基础 1、看门狗功能&#xff1a; 由于单片机的工作常常会受到来自外界电磁场的干扰&#xff0c;造成各种寄存器和内存的数据混乱&#xff0c;会导致程序指针错误等&#xff0c;程序运行可能会陷入死循环。程序的正常运行被打断&#xff0c;由单片机控制的系统无法继…

Motion Guidance: 扩散模型实现图像精确编辑的创新方法

在深度学习领域&#xff0c;扩散模型&#xff08;diffusion models&#xff09;因其能够根据文本描述生成高质量图像而备受关注。然而&#xff0c;这些模型在精确编辑图像中对象的布局、位置、姿态和形状方面仍存在挑战。本文提出了一种名为“运动引导”&#xff08;motion gui…

河南新企业如何把握建筑装饰乙级资质办理的最佳时机

河南新企业在办理建筑装饰乙级资质时&#xff0c;把握最佳时机是确保申请过程顺利、高效的关键。以下是一些建议&#xff0c;帮助新企业更好地把握办理时机&#xff1a; 一、了解政策动态与要求 关注政策变动&#xff1a;政策调整往往会影响资质办理的条件、流程和周期。企业…

【数据库了解与学习】

1.下载所需版本安装包 1.1将所需文件压缩包以及安装包放在你选择的任意一盘&#xff0c;新建一个没有文字和空格的文件夹 1.2双击打开安装包&#xff0c;选择Custom自定义模式然后点击右下方的Next 1.4三连点击1&#xff0c;再点击箭头出现3&#xff0c;选中3出现4&#xff0c;…

MySQL——JDBC中对象解释

DriverManager Class.forName("com.mysql.cj.jdbc.Driver"); // 固定写法&#xff0c;加载驱动 Connection connection DriverManager.getConnection(url, username, password); // Connection:代表数据库 // 数据库设置自动提交 // 事务提交 // 自动回滚 connecti…