Hot100之图论

200岛屿数量

题目

思路解析

把访问过的格子插上棋子

思想是先污染再治理,我们有一个inArea()函数,是判断是否出界了

我们先dfs()放各个方向遍历,然后我们再把这个位置标为0

我们岛屿是连着的1,所以我们遍历完后,我们要把遍历完的位置置为0,防止结果重复

代码

class Solution {public int numIslands(char[][] grid) {int count=0;for(int r=0;r<grid.length;r++)
{for(int c=0;c<grid[0].length;c++){if(grid[r][c]=='1'){dfs(r,c,grid);count++;}}
}
return count;}private void  dfs(int startindex1,int startindex2,char[][] grid)
{if(!inArea(grid,startindex1,startindex2))return ;if(grid[startindex1][startindex2]=='0')return ;grid[startindex1][startindex2]='0';dfs( startindex1- 1, startindex2,grid);dfs(startindex1 + 1, startindex2,grid);dfs( startindex1, startindex2 - 1,grid);dfs( startindex1, startindex2 + 1,grid);}boolean inArea(char[][] grid,int row,int cline)
{return row>=0&&row<grid.length&&cline>=0&&cline<grid[0].length;
}}

994腐烂的橘子 

题目

思路解析

我们一开始要统计腐烂的橘子的位置和fresh变量统计有几个新鲜的橘子

我们每腐烂一个新鲜橘子fresh就--

要是最后腐烂完还有新鲜橘子就返回-1,表示不能全部腐烂完

解题思路:我们腐烂的橘子放四个方向腐烂

为了防止重复腐烂,我们每遍历一次旧腐烂橘子就结束,然后把新腐烂橘子加入到List<int[]>里面

然后下次从新腐烂橘子开始腐烂

例如我们for循环的遍历的tmp就是我们的旧腐烂橘子,我们开始腐烂,腐烂的同时往q收集我们的新腐烂橘子

方便我们下次4个方向遍历腐烂橘子

for循环的条件:fresh > 0 && !q.isEmpty(),新鲜橘子>0并且还有能继续遍历的腐烂橘子

while (fresh > 0 && !q.isEmpty()) {ans++; // 经过一分钟List<int[]> tmp = q;q = new ArrayList<>();for (int[] pos : tmp) { // 已经腐烂的橘子往四个方向腐烂for (int[] d : DIRECTIONS) { // 四方向int i = pos[0] + d[0];int j = pos[1] + d[1];if (0 <= i && i < m && 0 <= j && j < n && grid[i][j] == 1) { // 新鲜橘子fresh--;grid[i][j] = 2; // 变成腐烂橘子q.add(new int[]{i, j});}}}}

代码

class Solution {//为了判断是否有永远不会腐烂的橘子(如示例 2),我们可以统计初始新鲜橘子的个数 fresh。//在 BFS 中,每有一个新鲜橘子被腐烂,就把 fresh 减一,这样最后如果发现 fresh>0,就意味着有橘子永远不会腐烂,返回 −1//新鲜橘子腐烂的时候我们要把1变成2private static final int[][] DIRECTIONS = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; // 四方向public int orangesRotting(int[][] grid) {int m = grid.length;int n = grid[0].length;int fresh = 0;List<int[]> q = new ArrayList<>();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (grid[i][j] == 1) {fresh++; // 统计新鲜橘子个数} else if (grid[i][j] == 2) {q.add(new int[]{i, j}); // 一开始就腐烂的橘子的下标}}}int ans = 0;while (fresh > 0 && !q.isEmpty()) {ans++; // 经过一分钟List<int[]> tmp = q;q = new ArrayList<>();for (int[] pos : tmp) { // 已经腐烂的橘子往四个方向腐烂for (int[] d : DIRECTIONS) { // 四方向int i = pos[0] + d[0];int j = pos[1] + d[1];if (0 <= i && i < m && 0 <= j && j < n && grid[i][j] == 1) { // 新鲜橘子fresh--;grid[i][j] = 2; // 变成腐烂橘子q.add(new int[]{i, j});}}}}return fresh > 0 ? -1 : ans;}
}

207课程表

题目

思路解析

判断是否有环

例如【0,1】【1,0】

在学课程0之前要学课程1

在学课程1之前要学课程0

这就是不可能的,用图来说就是有环

访问过不代表找到了环

所以我们要有三种状态

未访问 0

正在访问 1

访问完毕 2

我们最多有numCourses个课程,所以我们遍历numCourses次

for (int i = 0; i < numCourses; i++) {if (colors[i] == 0 && dfs(i, g, colors)) {return false; // 有环}}

我们一个节点可能对应多个学习顺序

例如0->1,0->2我们学习1,2之前一个要学习0,所以我们可以顺便把1,2两个节点都dfs完

我们把节点都遍历完后我们都没找到环,就说明我们的该节点x已经访问完毕,我们标记为2

private boolean dfs(int x, List<Integer>[] g, int[] colors) {colors[x] = 1; // x 正在访问中//开始遍历该节点//例如0->1,0->2,我们这个节点是0节点,我们就要遍历1,2for (int y : g[x]) {if (colors[y] == 1 || colors[y] == 0 && dfs(y, g, colors)) {return true; // 找到了环}}colors[x] = 2; // x 完全访问完毕return false; // 没有找到环}

代码

class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {List<Integer>[] g = new ArrayList[numCourses];Arrays.setAll(g, i -> new ArrayList<>());//初始化课程,也就是0->1,0->2,1->3这样子学习课程顺序初始化for (int[] p : prerequisites) {g[p[1]].add(p[0]);}//标记染色的数组int[] colors = new int[numCourses];//因为最多有numCourses个课程,所以我们最多遍历numCourses次for (int i = 0; i < numCourses; i++) {if (colors[i] == 0 && dfs(i, g, colors)) {return false; // 有环}}return true; // 没有环}private boolean dfs(int x, List<Integer>[] g, int[] colors) {colors[x] = 1; // x 正在访问中//开始遍历该节点//例如0->1,0->2,我们这个节点是-节点,我们就要遍历1,2for (int y : g[x]) {if (colors[y] == 1 || colors[y] == 0 && dfs(y, g, colors)) {return true; // 找到了环}}colors[x] = 2; // x 完全访问完毕return false; // 没有找到环}
}

208实现前缀树 

题目

思路解析

26叉树结构

首先我们是26个字母,所以我们应该是26叉树

我们定义一个Node结构来实现这个26叉树

然后我们还有个end标志位,标志这个位置是否是一个一个完整的单词

class Node{Node[] son=new Node[26];boolean end;
}

例如下面

我们的apple是一个完整的单词

我们的app是一个完整的单词

但我们是一个遍历顺序,所以我们这个end标志位是必要的

前缀树的初始化

我们有个root节点,保证所有的字符串都从root开始

   private Node root;public Trie() {root=new Node();}
插入

相当于我们不断构建树

我们Node结构中有一个Node数组 Node[] son=new Node[26]

我们用0,1,2,3表示a,b,c,d......

然后我们移动到遍历的字符的位置

最后单词遍历完毕我们有个end标志位,标志结束

public void insert(String word) {Node cur = root; // 从根节点开始for (char c : word.toCharArray()) {c -= 'a'; // 将字符转换为索引('a' -> 0, 'b' -> 1, ..., 'z' -> 25)if (cur.son[c] == null) { // 如果当前字符对应的子节点不存在cur.son[c] = new Node(); // 创建新节点}cur = cur.son[c]; // 移动到子节点}cur.end = true; // 标记单词的结尾}
find找单词

也就是从root节点开始找单词

private int find(String word) {Node cur = root; // 从根节点开始for (char c : word.toCharArray()) {c -= 'a'; // 将字符转换为索引if (cur.son[c] == null) { // 如果当前字符对应的子节点不存在return 0; // 返回 0,表示未找到}cur = cur.son[c]; // 移动到子节点}return cur.end ? 2 : 1; // 如果当前节点是单词结尾,返回 2;否则返回 1
}
search和startsWith

search:如果等于2说明前缀树中有这个单词

find:如果等于1或2说明我们前缀树中有这个单词前缀

public boolean search(String word) {return find(word)==2;//检查是否是完整单词}public boolean startsWith(String prefix) {return find(prefix) != 0;}

代码

class Node{Node[] son=new Node[26];boolean end;
}class Trie {private Node root;public Trie() {root=new Node();}public void insert(String word) {Node cur = root; // 从根节点开始for (char c : word.toCharArray()) {c -= 'a'; // 将字符转换为索引('a' -> 0, 'b' -> 1, ..., 'z' -> 25)if (cur.son[c] == null) { // 如果当前字符对应的子节点不存在cur.son[c] = new Node(); // 创建新节点}cur = cur.son[c]; // 移动到子节点}cur.end = true; // 标记单词的结尾}private int find(String word) {Node cur = root; // 从根节点开始for (char c : word.toCharArray()) {c -= 'a'; // 将字符转换为索引if (cur.son[c] == null) { // 如果当前字符对应的子节点不存在return 0; // 返回 0,表示未找到}cur = cur.son[c]; // 移动到子节点}return cur.end ? 2 : 1; // 如果当前节点是单词结尾,返回 2;否则返回 1
}public boolean search(String word) {return find(word)==2;//检查是否是完整单词}public boolean startsWith(String prefix) {return find(prefix) != 0;}}/*** Your Trie object will be instantiated and called as such:* Trie obj = new Trie();* obj.insert(word);* boolean param_2 = obj.search(word);* boolean param_3 = obj.startsWith(prefix);*/

 

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

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

相关文章

html中的表格属性以及合并操作

表格用table定义&#xff0c;标签标题用caption标签定义&#xff1b;用tr定义表格的若干行&#xff1b;用td定义若干个单元格&#xff1b;&#xff08;当单元格是表头时&#xff0c;用th标签定义&#xff09;&#xff08;th标签会略粗于td标签&#xff09; table的整体外观取决…

LabVIEW如何有效地进行数据采集?

数据采集&#xff08;DAQ&#xff09;是许多工程项目中的核心环节&#xff0c;无论是测试、监控还是控制系统&#xff0c;准确、高效的数据采集都是至关重要的。LabVIEW作为一个图形化编程环境&#xff0c;提供了丰富的功能来实现数据采集&#xff0c;确保数据的实时性与可靠性…

进阶数据结构——双向循环链表

目录 前言一、定义与结构二、特点与优势三、基本操作四、应用场景五、实现复杂度六、动态图解七、代码模版&#xff08;c&#xff09;八、经典例题九、总结结语 前言 这一期我们学习双向循环链表。双向循环链表不同于单链表&#xff0c;双向循环链表是一种特殊的数据结构&…

S4 HANA明确税金汇差科目(OBYY)

本文主要介绍在S4 HANA OP中明确税金汇差科目(OBYY)相关设置。具体请参照如下内容&#xff1a; 1. 明确税金汇差科目(OBYY) 以上配置点定义了在外币挂账时&#xff0c;当凭证抬头汇率和税金行项目汇率不一致时&#xff0c;造成的差异金额进入哪个科目。此类情况只发生在FB60/F…

在线知识库的构建策略提升组织信息管理效率与决策能力

内容概要 在线知识库作为现代企业信息管理的重要组成部分&#xff0c;具有显著的定义与重要性。它不仅为组织提供了一个集中存储与管理知识的平台&#xff0c;还能够有效提升信息检索的效率&#xff0c;促进知识的创新和利用。通过这样的知识库&#xff0c;企业可以更好地应对…

【汽车电子软件架构】AutoSAR从放弃到入门专栏导读

本文是汽车电子软件架构&#xff1a;AutoSAR从放弃到入门专栏的导读篇。文章延续专栏文章的一贯作风&#xff0c;从概念与定义入手&#xff0c;希望读者能对AutoSAR架构有一个整体的认识&#xff0c;然后对专栏涉及的文章进行分类与链接。本文首先从AutoSAR汽车软件架构的概念&…

DeepSeek-R1:通过强化学习激励大型语言模型(LLMs)的推理能力

摘要 我们推出了第一代推理模型&#xff1a;DeepSeek-R1-Zero和DeepSeek-R1。DeepSeek-R1-Zero是一个未经监督微调&#xff08;SFT&#xff09;作为初步步骤&#xff0c;而是通过大规模强化学习&#xff08;RL&#xff09;训练的模型&#xff0c;展现出卓越的推理能力。通过强…

响应式编程与协程

响应式编程与协程的比较 响应式编程的弊端虚拟线程Java线程内核线程的局限性传统线程池的demo虚拟线程的demo 响应式编程的弊端 前面用了几篇文章介绍了响应式编程&#xff0c;它更多的使用少量线程实现线程间解耦和异步的作用&#xff0c;如线程的Reactor模型&#xff0c;主要…

本地部署DeepSeek-R1模型(新手保姆教程)

背景 最近deepseek太火了&#xff0c;无数的媒体都在报道&#xff0c;很多人争相着想本地部署试验一下。本文就简单教学一下&#xff0c;怎么本地部署。 首先大家要知道&#xff0c;使用deepseek有三种方式&#xff1a; 1.网页端或者是手机app直接使用 2.使用代码调用API …

当WebGIS遇到智慧文旅-以长沙市不绕路旅游攻略为例

目录 前言 一、旅游数据组织 1、旅游景点信息 2、路线时间推荐 二、WebGIS可视化实现 1、态势标绘实现 2、相关位置展示 三、成果展示 1、第一天旅游路线 2、第二天旅游路线 3、第三天旅游路线 4、交通、订票、住宿指南 四、总结 前言 随着信息技术的飞速发展&…

93,【1】buuctf web [网鼎杯 2020 朱雀组]phpweb

进入靶场 页面一直在刷新 在 PHP 中&#xff0c;date() 函数是一个非常常用的处理日期和时间的函数&#xff0c;所以应该用到了 再看看警告的那句话 Warning: date(): It is not safe to rely on the systems timezone settings. You are *required* to use the date.timez…

如何在电脑上部署deepseek

由于免费的网页版经常显示服务器异常&#xff0c;并且每次打开网页麻烦&#xff0c;我们可以采用电脑部署的方法&#xff0c;V3和V2现在都很便宜&#xff0c;试了一下问了一下午问题也才0.1&#xff0c;而且现在注册就送14元&#xff0c;心动不如行动&#xff0c;快来薅羊毛&am…

SmartPipe完成新一轮核心算法升级

1. 增加对低质量轴段的修正 由于三维图纸导出造成某些轴段精度较差&#xff0c;部分管路段的轴线段不满足G1连续&#xff0c;SmartPipe采用算法对这种情况进行了修正&#xff0c;保证轴段在一定精度范围内光滑连续。 2. 优化对中文路径的处理 SmartPipeBatch批处理版本优化…

2.3学习总结

今天做了下上次测试没做出来的题目&#xff0c;作业中做了一题&#xff0c;看了下二叉树&#xff08;一脸懵B&#xff09; P2240&#xff1a;部分背包问题 先求每堆金币的性价比&#xff08;价值除以重量&#xff09;&#xff0c;将这些金币由性价比从高到低排序。 对于排好…

四川正熠法律咨询有限公司正规吗可信吗?

在纷繁复杂的法律环境中&#xff0c;寻找一家值得信赖的法律服务机构是每一个企业和个人不可或缺的需求。四川正熠法律咨询有限公司&#xff0c;作为西南地区备受瞩目的法律服务提供者&#xff0c;以其专注、专业和高效的法律服务&#xff0c;成为众多客户心中的首选。 正熠法…

【leetcode练习·二叉树拓展】快速排序详解及应用

本文参考labuladong算法笔记[拓展&#xff1a;快速排序详解及应用 | labuladong 的算法笔记] 1、算法思路 首先我们看一下快速排序的代码框架&#xff1a; def sort(nums: List[int], lo: int, hi: int):if lo > hi:return# 对 nums[lo..hi] 进行切分# 使得 nums[lo..p-1]…

FPGA学习篇——开篇之作

今天正式开始学FPGA啦&#xff0c;接下来将会编写FPGA学习篇来记录自己学习FPGA 的过程&#xff01; 今天是大年初六&#xff0c;简单学一下FPGA的相关概念叭叭叭&#xff01; 一&#xff1a;数字系统设计流程 一个数字系统的设计分为前端设计和后端设计。在我看来&#xff0…

DeepSeek R1 简易指南:架构、本地部署和硬件要求

DeepSeek 团队近期发布的DeepSeek-R1技术论文展示了其在增强大语言模型推理能力方面的创新实践。该研究突破性地采用强化学习&#xff08;Reinforcement Learning&#xff09;作为核心训练范式&#xff0c;在不依赖大规模监督微调的前提下显著提升了模型的复杂问题求解能力。 技…

Vue3学习笔记-模板语法和属性绑定-2

一、文本插值 使用{ {val}}放入变量&#xff0c;在JS代码中可以设置变量的值 <template><p>{{msg}}</p> </template> <script> export default {data(){return {msg: 文本插值}} } </script> 文本值可以是字符串&#xff0c;可以是布尔…

Android学习19 -- 手搓App

1 前言 之前工作中&#xff0c;很多时候要搞一个简单的app去验证底层功能&#xff0c;Android studio又过于重型&#xff0c;之前用gradle&#xff0c;被版本匹配和下载外网包折腾的堪称噩梦。所以搞app都只有找应用的同事帮忙。一直想知道一些简单的app怎么能手搓一下&#x…