TOP100 图论

3.207. 课程表

你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。

在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程  bi 。

  • 例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。

请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。

示例 1:

输入:numCourses = 2, prerequisites = [[1,0]]
输出:true
解释:总共有 2 门课程。学习课程 1 之前,你需要完成课程 0 。这是可能的。

示例 2:

输入:numCourses = 2, prerequisites = [[1,0],[0,1]]
输出:false
解释:总共有 2 门课程。学习课程 1 之前,你需要先完成​课程 0 ;并且学习课程 0 之前,你还应先完成课程 1 。这是不可能的。

提示:

  • 1 <= numCourses <= 2000
  • 0 <= prerequisites.length <= 5000
  • prerequisites[i].length == 2
  • 0 <= ai, bi < numCourses
  • prerequisites[i] 中的所有课程对 互不相同

思路:

1.首先构建一个邻接表,并开始遍历prerequisites数组,记录每一个顶点(一门课)的入度。prerequisites[i] =(m,n)表示学习m前必须学习n,则m的入度+1,邻接表key=m对应value数组添加n。
2.再次遍历,每次选择入度为0的顶点,入队,并将判断将相关顶点入度-1。
3.最后判断所有入度是否为0,是则可以修完,否则不可以。

代码:


class Solution {// 节点的入度: 使用数组保存每个节点的入度,public boolean canFinish(int numCourses, int[][] prerequisites) {// 1.课号和对应的入度Map<Integer, Integer> inDegree = new HashMap<>();// 将所有的课程先放入for (int i = 0; i < numCourses; i++) {inDegree.put(i, 0);}// 2.依赖关系, 依赖当前课程的后序课程Map<Integer, List<Integer>> adj = new HashMap<>();// 初始化入度和依赖关系for (int[] relate : prerequisites) {// (3,0), 想学3号课程要先完成0号课程, 更新3号课程的入度和0号课程的依赖(邻接表)int cur = relate[1];int next = relate[0];// 1.更新入度inDegree.put(next, inDegree.get(next) + 1);// 2.当前节点的邻接表if (!adj.containsKey(cur)) {adj.put(cur, new ArrayList<>());}adj.get(cur).add(next);}// 3.BFS, 将入度为0的课程放入队列, 队列中的课程就是没有先修, 可以学的课程Queue<Integer> q = new LinkedList<>();for (int key : inDegree.keySet()) {if (inDegree.get(key) == 0) {q.offer(key);}}// 取出一个节点, 对应学习这门课程.// 遍历当前邻接表, 更新其入度; 更新之后查看入度, 如果为0, 加入到队列while (!q.isEmpty()) {int cur = q.poll();// 遍历当前课程的邻接表, 更新后继节点的入度if (!adj.containsKey(cur)) {continue;}List<Integer> successorList = adj.get(cur);for (int k : successorList) {inDegree.put(k, inDegree.get(k) - 1);if (inDegree.get(k) == 0) {q.offer(k);}}}// 4.遍历入队, 如果还有课程的入度不为0, 返回faslefor (int key : inDegree.keySet()) {if (inDegree.get(key) != 0) {return false;}}return true;}
}

4.208. 实现 Trie (前缀树)

Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。

请你实现 Trie 类:

  • Trie() 初始化前缀树对象。
  • void insert(String word) 向前缀树中插入字符串 word 。
  • boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。
  • boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。

示例:

输入
["Trie", "insert", "search", "search", "startsWith", "insert", "search"]
[[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]]
输出
[null, null, true, false, true, null, true]解释
Trie trie = new Trie();
trie.insert("apple");
trie.search("apple");   // 返回 True
trie.search("app");     // 返回 False
trie.startsWith("app"); // 返回 True
trie.insert("app");
trie.search("app");     // 返回 True

提示:

  • 1 <= word.length, prefix.length <= 2000
  • word 和 prefix 仅由小写英文字母组成
  • insertsearch 和 startsWith 调用次数 总计 不超过 3 * 10^4 次

思路:

这一篇非常好

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

代码:

python版:

class Node:def __init__(self):self.is_End = Falseself.next=[None]*26class Trie:def __init__(self):self.root=Node()def insert(self, word: str) -> None:cur=self.rootfor c in word:c_i=ord(c)-ord('a')if not cur.next[c_i]:cur.next[c_i]=Node()cur = cur.next[c_i]cur.is_End = Truedef search(self, word: str) -> bool:cur = self.rootfor c in word:c_i=ord(c)-ord('a')if cur.next[c_i]:cur=cur.next[c_i]else:return Falsereturn cur.is_Enddef startsWith(self, prefix: str) -> bool:cur = self.rootfor c in prefix:c_i=ord(c)-ord('a')if cur.next[c_i]:cur=cur.next[c_i]else:return Falsereturn True# Your Trie object will be instantiated and called as such:
# obj = Trie()
# obj.insert(word)
# param_2 = obj.search(word)
# param_3 = obj.startsWith(prefix)

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

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

相关文章

el-form validator的校验提示遮盖下边的内容

问题&#xff1a;表单的validator校验&#xff0c;无法自动撑起tip提示的高度&#xff0c;导致遮盖了下边内容 解决方式&#xff1a;将tip提示的样式的定位设置为遵循正常的文档流对象&#xff0c;实现自适应高度。 .el-form-item .el-form-item__content .el-form-item__err…

探索ls命令中的通配符匹配

在Linux系统中&#xff0c;ls命令是一个常用的文件列表显示工具。除了基本的文件显示功能外&#xff0c;ls还支持通配符匹配&#xff0c;通过使用通配符&#xff0c;用户可以更灵活地过滤和显示文件。本篇博客将介绍ls命令中的通配符&#xff0c;包括问号&#xff08;?&#x…

数据库MySQL中出现乱码和表格不对齐怎么解决

MySQL中出现乱码问题及解决办法&#xff1a; 情况类似&#xff1a; 首先进入到数据库中&#xff0c;命令&#xff1a;mysql -h localhost -uroot -p或者mysql -uroot -p;进入数据库后选择一个你的数据库查看表中的中文是否乱码 以上是数据库中表格出现乱码情况&#xff0c;原…

Cesium 问题——加载 gltf 格式的模型之后太小,如何让相机视角拉近

文章目录 问题分析问题 刚加载的模型太小,如何拉近视角放大 分析 在这里有两种方式进行拉近视角, 一种是点击复位进行视角拉近一种是刚加载就直接拉近视角// 模型三加载 this.damModel = new Cesium.Entity({name: "gltf模型",position:</

Redis:常用数据类型及其应用场景

Redis中常见的数据类型有五种&#xff1a;String&#xff08;字符串&#xff09;&#xff0c;Hash&#xff08;哈希&#xff09;&#xff0c;List&#xff08;列表&#xff09;&#xff0c;Set&#xff08;集合&#xff09;、Zset&#xff08;有序集合&#xff09;。下面我来分…

Java 基于 SpringBoot+Vue 的高校招生系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

[计算机网络]---Http协议

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 本期学习&#xf…

C++智能指针的知识!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家好呀&#xff0c;我是PingdiGuo_guo&#xff0c;今天我们来学习一下智能指针。 文章目录 1.智能指针的概念 2.智能指针的思想 3.智能指针的作用 3.1 自动内存管理 3.2 共享所有权 3.3 避免悬挂指针…

【DRAM存储器二十】DDR3介绍-主要功能之ODT

👉个人主页:highman110 👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容 参考资料:《镁光DDR3数据手册》 、《JESD79-3E》 目录 DDR3 ODT

【多线程】线程的概念与创建

多线程 1. 认识线程&#xff08;Thread&#xff09;线程是什么为啥要有线程进程和线程的区别Java 的线程 和 操作系统线程 的关系 2.第⼀个多线程程序3.创建线程⽅法1 继承 Thread 类⽅法2 实现 Runnable 接⼝方法3 匿名内部类创建 Thread ⼦类对象方法4 匿名内部类创建 Runnab…

01_basicLinux内核模块

环境 rootT:/media/sf_D_DRIVE/kmodule/01_basic# cat /etc/os-release PRETTY_NAME"Ubuntu 22.04.1 LTS" NAME"Ubuntu" VERSION_ID"22.04" VERSION"22.04.1 LTS (Jammy Jellyfish)" VERSION_CODENAMEjammy IDubuntu ID_LIKEdebian HO…

JavaScript:面向对象编程

文章目录 对象&#xff08;Objects&#xff09;构造函数&#xff08;Constructor functions&#xff09;原型&#xff08;Prototypes&#xff09;原型链&#xff08;Prototype chain&#xff09;类&#xff08;Classes&#xff09;继承&#xff08;Inheritance&#xff09; Jav…

linux 中date 命令的用法

在Linux系统中&#xff0c;date命令用于显示或设置系统的日期和时间。date命令可以显示当前日期时间、设置系统时间、格式化日期时间等。以下是date命令的一些常用用法&#xff1a; 显示当前日期时间 date这会显示当前系统时间和日期。 显示特定格式的日期时间 date "…

python-自动化篇-办公-批量新建文件夹并保存日志信息

文章目录 说明代码效果 说明 因为业务需要&#xff0c;每天都需要按当天的日期创建很多新文件夹。把这种重复又繁重的操作交给Python来做&#xff0c;一直是我的目标。先说下要求&#xff1a; 默认在桌面新建文件夹。文件夹命名方式&#xff0c;“月.日-1”&#xff0c;比如7…

transformer 最简单学习1 输入层embeddings layer

词向量的生成可以通过嵌入层&#xff08;Embedding Layer&#xff09;来完成。嵌入层是神经网络中的一种常用层&#xff0c;用于将离散的词索引转换为密集的词向量。以下是一个典型的步骤&#xff1a; 建立词表&#xff1a;首先&#xff0c;需要从训练数据中收集所有的词汇&…

Instagram 账号被封如何申诉?ins账号解封经验分享

不知道各位在玩转海外社媒平台时有没有遇到过Instagram账号异常的情况&#xff0c;比如会出现账号受限、帖子发不出去、账号被封号等情况?Instagram账号如果被封不用马上弃用&#xff0c;我们可以先尝试一下申诉&#xff0c;看看能不能把账号解封。所以今天将会出一篇Instagra…

开工大吉!秀一下我们假期の战绩

开工大吉&#xff0c;新年新气象 首先祝大家开工大吉&#xff0c;新年新气象。 祝我的粉丝股东们都能&#xff1a;顺利上岸&#xff0c;升职加薪&#xff0c;日进斗金&#xff01; 开工就要冲冲冲&#xff01; 春节假期我是好好放松了&#xff0c;在努力克制自己不要像之前…

10万日活服务器配置选择,费用价格明细

阿里云10万人服务器配置多少钱一年&#xff1f;可以选择阿里云4核8G服务器&#xff0c;云服务器ECS通用算力u1是955.58元一年&#xff0c;云服务器c7是3000元左右一年&#xff0c;如果是轻量应用服务器价格会更划算一些&#xff0c;阿里云服务器网aliyunfuwuqi.com整理日活10万…

设计模式的目的

编写软件过程中&#xff0c;程序员面临着来自耦合性&#xff0c;内聚性以及可维护性&#xff0c;可扩展性&#xff0c;重用性&#xff0c;灵活性等多方面的挑战&#xff0c;设计模式是为了让程序(软件)&#xff0c;具有更好的&#xff1a; 代码重用性(即:相同功能的代码&#…

VSCODE上使用python_Django

接上篇 https://blog.csdn.net/weixin_44741835/article/details/136135996?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22136135996%22%2C%22source%22%3A%22weixin_44741835%22%7D VSCODE官网&#xff1a; Editing Python …