[Leetcode][第207题][JAVA][课程表][拓扑排序][DFS]

【问题描述】[中等]

在这里插入图片描述

【解答思路】

1. 拓扑排序

在这里插入图片描述

复杂度分析
在这里插入图片描述
HashSet[] 数组

import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;public class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {if (numCourses <= 0) {return false;}// 特判int pLen = prerequisites.length;if (pLen == 0) {return true;}int[] inDegree = new int[numCourses];HashSet<Integer>[] adj = new HashSet[numCourses];for (int i = 0; i < numCourses; i++) {adj[i] = new HashSet<>();}for (int[] p : prerequisites) {inDegree[p[0]]++;adj[p[1]].add(p[0]);}Queue<Integer> queue = new LinkedList<>();// 首先加入入度为 0 的结点for (int i = 0; i < numCourses; i++) {if (inDegree[i] == 0) {queue.add(i);}}// 记录已经出队的课程数量int cnt = 0;while (!queue.isEmpty()) {Integer top = queue.poll();cnt += 1;// 遍历当前出队结点的所有后继结点for (int successor : adj[top]) {inDegree[successor]--;if (inDegree[successor] == 0) {queue.add(successor);}}}return cnt == numCourses;}
}

List<List>

class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {int[] indegrees = new int[numCourses];List<List<Integer>> adjacency = new ArrayList<>();Queue<Integer> queue = new LinkedList<>();for(int i = 0; i < numCourses; i++)adjacency.add(new ArrayList<>());// Get the indegree and adjacency of every course.for(int[] cp : prerequisites) {indegrees[cp[0]]++;adjacency.get(cp[1]).add(cp[0]);}// Get all the courses with the indegree of 0.for(int i = 0; i < numCourses; i++)if(indegrees[i] == 0) queue.add(i);// BFS TopSort.while(!queue.isEmpty()) {int pre = queue.poll();numCourses--;for(int cur : adjacency.get(pre))if(--indegrees[cur] == 0) queue.add(cur);}return numCourses == 0;}
}
2. DFS

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

复杂度
在这里插入图片描述

class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {List<List<Integer>> adjacency = new ArrayList<>();for(int i = 0; i < numCourses; i++)adjacency.add(new ArrayList<>());int[] flags = new int[numCourses];for(int[] cp : prerequisites)adjacency.get(cp[1]).add(cp[0]);for(int i = 0; i < numCourses; i++)if(!dfs(adjacency, flags, i)) return false;return true;}private boolean dfs(List<List<Integer>> adjacency, int[] flags, int i) {if(flags[i] == 1) return false;if(flags[i] == -1) return true;flags[i] = 1;for(Integer j : adjacency.get(i))if(!dfs(adjacency, flags, j)) return false;flags[i] = -1;return true;}
}

【总结】

1. 拓扑排序

拓扑排序实际上应用的是贪心算法。贪心算法简而言之:每一步最优,全局就最优。

具体到拓扑排序,每一次都从图中删除没有前驱的顶点,这里并不需要真正的做删除操作,我们可以设置一个入度数组,每一轮都输出入度为 00 的结点,并移除它、修改它指向的结点的入度(-1−1即可),依次得到的结点序列就是拓扑排序的结点序列。如果图中还有结点没有被移除,则说明“不能完成所有课程的学习”。

拓扑排序保证了每个活动(在这题中是“课程”)的所有前驱活动都排在该活动的前面,并且可以完成所有活动。拓扑排序的结果不唯一。拓扑排序还可以用于检测一个有向图是否有环。相关的概念还有 AOV 网,这里就不展开了。


在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.拓扑排序

1.统计箭头指向的度
2.度为0的入队
3.统计层数 出队 相关度减一且度为0入队
4.队为空作判断

3.相关题目[Leedcode][JAVA][第210 题][课程表 II][拓扑排序][BFS][DFS][有向图]

转载链接:https://leetcode-cn.com/problems/course-schedule/solution/tuo-bu-pai-xu-by-liweiwei1419/
作者:Krahets
转载链接:https://leetcode-cn.com/problems/course-schedule/solution/course-schedule-tuo-bu-pai-xu-bfsdfsliang-chong-fa/

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

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

相关文章

RabbitMQ(1) - win+rabbitMQ

rabbitMQ是一个在AMQP协议标准基础上完整的&#xff0c;可服用的企业消息系统。它遵循Mozilla Public License开源协议&#xff0c;采用 Erlang 实现的工业级的消息队列(MQ)服务器&#xff0c;Rabbit MQ 是建立在Erlang OTP平台上。 1.安装Erlang 所以在安装rabbitMQ之前&…

[周赛][Leetcode][第5457题][JAVA][动态规划][和为奇数的子数组数目]

【问题描述】5457. 和为奇数的子数组数目[中等] 【解答思路】 1. 动态规划 第 1 步&#xff1a;设计状态 dp[i][0] 记录以arr[i]结尾的和为奇数数量 dp[i][1] 记录以arr[i]结尾的和为偶数数量 第 2 步&#xff1a;状态转移方程 for(int i1;i<n;i){if(arr[i]%20){dp[i][0]…

第九期: 阿里巴巴程序员常用的15款开发者工具

阿里巴巴将自身在各类业务场景下的技术积淀&#xff0c;通过开源、云上实现或工具等形式对外开放&#xff0c;本文将精选了一些阿里巴巴的开发者工具&#xff0c;希望能帮助开发者们提高开发效率、更优雅的写代码。 从人工到自动化&#xff0c;从重复到创新&#xff0c;技术演进…

第三十三期:对于人工智能的恐惧及其5个解决方法

实施人工智能技术的IT领导人可能会感到一些恐惧&#xff0c;这有着充分的理由。人工智能在拥有数十年发展和应用历史的同时却有着奇怪的定位&#xff0c;但对于许多人来说&#xff0c;人工智能仍然是一种未来主义的感觉。 实施人工智能技术的IT领导人可能会感到一些恐惧&#x…

[Leetcode][第392题][JAVA][判断子序列][动态规划][双指针]

【问题描述】[简单] 【解答思路】 1. 双指针 时间复杂度&#xff1a;O(NM) 空间复杂度&#xff1a;O(1) class Solution { public:bool isSubsequence(string s, string t) {int n s.length(), m t.length();int i 0, j 0;while (i < n && j < m) {if (s[…

权限分配之权限的展示

最后就是权限的展示了&#xff1a;对前面的 总结&#xff1a;  1. 一级菜单列表&#xff0c;是我对 menu表的&#xff0c;增删改查。  2. 二级菜单列表&#xff0c;是我对Permission表中&#xff0c; 可以作为二级菜单存在&#xff0c;如 客户列表、账单列表的 增删改查  …

优先队列----堆

问题 打印机打印作业一般是放在队列中的。如果按照先来先打印的顺序&#xff0c;有一个100页的打印任务&#xff0c;那么会让后面短小的任务等待很长时间。更合理的做法也许是最后处理最耗时的打印任务&#xff0c;不管它是不是最后提交上来的。 在多用户操作系统中&#xff…

第三十四期:游戏开发中常见的10种编程语言

游戏开发是非常有经验和熟练的程序员的工作。 它可能花费数亿美元。 这是一项非常有创意的工作&#xff0c;也需要技术水平。 他们需要具有特定需求的编程语言。 游戏开发是非常有经验和熟练的程序员的工作。 它可能花费数亿美元。 这是一项非常有创意的工作&#xff0c;也需要…

[Leetcode][第5458题][JAVA][字符串的好分割数目][双指针][HashSet]

【问题描述】5458. 字符串的好分割数目[中等] 【解答思路】 1. 双指针 前面的搜索前面的个数和&#xff0c;后面的搜索后面的个数和 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a;O(1) class Solution {/*双指针做法&#xff0c;前面的搜索前面的个数和&#xff0c;…

第三十五期:AI核心难点之一:情感分析的常见类型与挑战

情感分析或情感人工智能&#xff0c;在商业应用中通常被称为意见挖掘&#xff0c;是自然语言处理(NLP)的一个非常流行的应用。文本处理是该技术最大的分支&#xff0c;但并不是唯一的分支。情绪AI有三种类型及其组合。 情感分析或情感人工智能&#xff0c;在商业应用中通常被称…

[Leetcode][第104题][JAVA][二叉树的最大深度][递归][BFS]

【问题描述】[简单] 【解答思路】 1. 递归 终止条件/基本情况 root null 递推关系 max(l,r)1 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(height) class Solution {public int maxDepth(TreeNode root) {if (root null) {return 0;} else {int leftHeight ma…

第三十六期:人工智能统计调查:86%的消费者更喜欢人工客服

美国消费者越来越不愿意与聊天机器人聊天&#xff0c;人们对人工智能作为关键业务组成部分的期望越来越高&#xff0c;由于部署这项新技术导致员工技能差距越来越大。 最近一些人工智能的健康和进展状况相关调查、研究、预测和其他定量评估突显出以下几点&#xff1a;美国消费者…

[Leetcode][第111题][JAVA][BFS][二叉树的最小深度][BFS][递归]

【问题描述】[简单] 【解答思路】 1. 递归 自下而上 基本情况/结束条件 &#xff1a; 叶子节点的定义是左孩子和右孩子都为 null 时叫做叶子节点 当 root 节点左右孩子都为空时&#xff0c;返回 1 当 root 节点左右孩子有一个为空时&#xff0c;返回不为空的孩子节点的深度 当…

75 jsp基础语法汇总

JSP语法 脚本程序 脚本程序可以包含任意量量的Java语句句、变量量、⽅方法或表达式&#xff0c;只要它们在脚本语⾔言 中是有效的。 脚本程序的语法格式&#xff1a; <% 代码⽚片段 %>或者&#xff0c;您也可以编写与其等价的XML语句句&#xff0c;就像下⾯面这样&#…

[递归]一文看懂递归

1. 递归的定义 编程语言中&#xff0c;函数 Func(Type a,……) 直接或间接调用函数本身&#xff0c;则该函数称为「递归函数」。 在实现递归函数之前&#xff0c;有两件重要的事情需要弄清楚: 递推关系&#xff1a;一个问题的结果与其子问题的结果之间的关系。基本情况&…

[Leetcode][第206题][JAVA][反转一个单链表][递归][迭代]

【问题描述】[简单] 【解答思路】 1. 递归 自底向上 基本条件/终止条件&#xff1a;当前节点或者下一个节点null 递推关系&#xff1a; head.next.next head 在函数内部&#xff0c;改变节点的指向&#xff0c;也就是 head 的下一个节点指向 head 递归函数那句 时间…

3.项目的基本概念

项目的基本概念 项目及其特征