刷题笔记25——图论课程表

news/2024/12/12 5:05:00/

为了最终理解你所不理解的,你必须经历一条愚昧无知的道路。为了占有你从未占有的东西,你必须经历被剥夺的道路。为了达到你现在所不在的名位,你必须经历那条你不在其中的道路。——艾略特

797. 所有可能的路径(已经告知:是有向无环图,所以不需要设置visited)

  • 非常奇妙,我最初的错误是如下,在找到目标节点后直接加入到res中,但是发现结果输出的数量是对的,但是都是空的
  • 可能的原因是:path就算被加入到res中,但是只是加入了地址,后序path的修改还是会影响到res
  • 修改:在加入 res 的时候新建空间,问题解决
		if(n == sz-1){res.add(result);}
class Solution {List<Integer> path = new LinkedList<>();List<List<Integer>> res = new LinkedList<List<Integer>>();public List<List<Integer>> allPathsSourceTarget(int[][] graph) {traverse(graph,0);return res;}void traverse(int[][] graph,int n){path.add(n);int sz = graph.length;if(n == sz-1){List<Integer> result = new LinkedList<>(path);res.add(result);}else{for(int node:graph[n]){traverse(graph,node);}}path.remove(path.size()-1);}
}
  • 比如我们写代码 import 包也是一个例子,必须合理设计代码目录结构,否则会出现循环依赖,编译器会报错,所以编译器实际上也使用了类似算法来判断你的代码是否能够成功编译。看到依赖问题,首先想到的就是把问题转化成「有向图」这种数据结构,只要图中存在环,那就说明存在循环依赖。

207. 课程表

  • visited是以整个图为维度判断是否重复遍历,onPath是以路径为维度判断是否有环,区别在于后续遍历的处理。两者不能互相替代。
  • 目前感觉最大的问题就是对数据类型的定义,像graph要用什么类型来存,以及graph如果是两层的话,那么需要对下一层再进行new
  • arraylist和linkedlist都可以用,功能也相近,但是要看具体算法中,是更多索引操作还是增删操作
  • 其余的话就都是照抄板子
List<Integer>[] graph = new LinkedList[numCourses];
for(int i=0;i<numCourses;i++){graph[i] = new LinkedList<>();
}
class Solution {boolean[] visited;boolean[] path;boolean isCycle = false;public boolean canFinish(int numCourses, int[][] prerequisites) {List<Integer>[] graph = generateGraph(numCourses,prerequisites);visited = new boolean[numCourses];path = new boolean[numCourses];for(int i=0;i<numCourses;i++){traverse(graph,i);   }return !isCycle;}void traverse(List<Integer>[] graph,int n){if(path[n]){isCycle = true;}if(visited[n]||isCycle){return;}visited[n] = true;path[n] = true;for(int node:graph[n]){traverse(graph,node);}path[n] = false;}List<Integer>[] generateGraph(int numCourses, int[][] prerequisites){List<Integer>[] graph = new LinkedList[numCourses];for(int i=0;i<numCourses;i++){graph[i] = new LinkedList<>();}for(int i=0;i<prerequisites.length;i++){graph[prerequisites[i][1]].add(prerequisites[i][0]);}return graph;}
}

210. 课程表 II (有点像不明白为什么是在后序遍历那块记录路径,可能就是后序的时候,可以保证每个节点的前导节点已经遍历过了)

class Solution {boolean[] visited;boolean[] path;int[] res;boolean isCycle = false;int i=0;public int[] findOrder(int numCourses, int[][] prerequisites) {List<Integer>[] graph = generateGraph(numCourses,prerequisites);visited = new boolean[numCourses];path = new boolean[numCourses];res = new int[numCourses];for(int i=0;i<numCourses;i++){traverse(graph,i);}if(!isCycle){int[] result = new int[numCourses];for(int i=0;i<numCourses;i++){result[i] = res[numCourses-i-1];}return result;}else{return new int[]{};}}void traverse(List<Integer>[] graph,int n){if(path[n]){isCycle = true;}if(path[n] || visited[n]){return;}visited[n] = true;path[n] = true;for(int node:graph[n]){traverse(graph,node);}path[n] = false;res[i] = n;i++;}List<Integer>[] generateGraph(int numCourses, int[][] prerequisites){List<Integer>[] graph = new LinkedList[numCourses];for(int i=0;i<numCourses;i++){graph[i] = new LinkedList();}for(int i=0;i<prerequisites.length;i++){graph[prerequisites[i][1]].add(prerequisites[i][0]);}return graph;}}

http://www.ppmy.cn/news/1117575.html

相关文章

口罩识别检测开源数据集汇总

SF-MASK 数据集下载链接&#xff1a;http://suo.nz/2E6ADA 从监控录像中对有面具和无面具的人脸进行分类是最困难的任务之一&#xff0c;数据集SF-MASK来解决这些问题&#xff0c;该数据集适用于小尺寸人脸、部分隐藏的人脸、各种人脸方向和各种面具类型等。SF-MASK是通过收集…

Python画图系列——折线图

好看的折线图 import numpy as np import matplotlib.pyplot as plt# 生成随机数据 # np.random.seed(42) # 设置随机种子以确保可重复性 sample_numbers np.arange(1, 21) # 生成1到20的样本编号random_data np.random.rand(20) # 生成20个随机数&#xff0c;范围在0到1之…

嵌入式-数据进制之间的转换

目录 一.简介 1.1十进制 1.2二进制 1.3八进制 1.4十六进制 二.进制转换 2.1二进制-十进制转换 2.2八进制-十进制转换 2.3十六进制-十进制转换 2.4十进制-二进制转换 2.5十进制-八进制转换 2.6十进制-十六进制转换 2.7小数部分转换 一.简介 被传入到计算机的数据要…

解密Java多线程中的锁机制:CAS与Synchronized的工作原理及优化策略

目录 CAS什么是CASCAS的应用ABA问题异常举例 Synchronized 原理基本特征加锁过程偏向锁轻量级锁重量级锁 其他优化操作锁消除锁粗化 CAS 什么是CAS CAS: 全称Compare and swap&#xff0c;字面意思:”比较并交换“&#xff0c;CAS涉及如下操作&#xff1a; 假设内存中的原数据…

C++中 负数与String字符串的长度 string.size()作比较 输出错误

在刷题的时候&#xff0c;发现用 -1<t.size() 输出的是错误的值&#xff0c;如下&#xff0c;t“ABC”&#xff0c;但重新定义一个变量后又可以了&#xff0c;查阅检查后&#xff0c;发现string.size()返回的是一个无符号的整数&#xff0c;因此与有符号整数比较&#xff0c…

安卓手机便签数据迁移到苹果手机怎么操作?

iPhone15系列手机已经发布&#xff0c;有不少网友准备在今年更换新款的苹果手机。并且有不少之前的小米、OPPO、vivo手机老用户&#xff0c;这次想要更换iPhone15系列手机&#xff0c;体验一下不同的iOS操作系统。不过在换手机之前&#xff0c;还有一件重要的事情需要考虑&…

elasticsearch索引同步

通常项目中使用elasticsearch需要完成索引同步&#xff0c;索引同步的方法很多&#xff1a; #1、针对实时性非常高的场景需要满足数据的及时同步&#xff0c;可以同步调用&#xff0c;或使用Canal去实现。 1&#xff09;同步调用即在向MySQL写数据后远程调用搜索服务的接口写…

如何实现不同MongoDB实例间的数据复制?

作为一种Schema Free文档数据库&#xff0c;MongoDB因其灵活的数据模型&#xff0c;支撑业务快速迭代研发&#xff0c;广受开发者欢迎并被广泛使用。在企业使用MongoDB承载应用的过程中&#xff0c;会因为业务上云/跨云/下云/跨机房迁移/跨地域迁移、或数据库版本升级、数据库整…