leetcode207. 课程表(dfs/bfs)
你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。
在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]
给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?
示例 1:
输入: 2, [[1,0]]
输出: true
解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。
DFS代码
class Solution {boolean[] finished;public boolean canFinish(int numCourses, int[][] prerequisites) {finished=new boolean[numCourses];HashMap<Integer,List<Integer>> map=new HashMap<>();//记录课程学完后可以学习的课程HashMap<Integer,HashSet<Integer>> map2=new HashMap<>();//记录需要先修的课程for(int i=0;i<numCourses;i++)//创建邻接表{map.put(i,new ArrayList<>());map2.put(i,new HashSet<>());}for(int[] pre:prerequisites){map.get(pre[1]).add(pre[0]);map2.get(pre[0]).add(pre[1]);}for(int i=0;i<numCourses;i++)Finish(i,map,map2);for(int i=0;i<numCourses;i++)//检查是不是全部学完了if(!finished[i]) return false;return true;}public void Finish(int cur,HashMap<Integer,List<Integer>> map, HashMap<Integer,HashSet<Integer>> map2) {//深度优先搜索if(!map2.get(cur).isEmpty()) return;finished[cur]=true;for(int next:map.get(cur)){map2.get(next).remove(cur);Finish(next,map,map2);}}
}
BFS代码
public boolean canFinish(int numCourses, int[][] prerequisites) {Queue<Integer> queue=new LinkedList<>();int[] adj=new int[numCourses];Map<Integer,Set<Integer>> pre=new HashMap<>();for(int i=0;i<numCourses;i++)pre.put(i,new HashSet<>());for(int[] t:prerequisites){pre.get(t[1]).add(t[0]);//邻接表adj[t[0]]++;//记录节点的入度}for(int i=0;i<numCourses;i++)//入度为0的节点入队if(adj[i]==0) queue.add(i);while (!queue.isEmpty()){int cur=queue.poll();for(int c:pre.get(cur))//相邻节点入度减1{if(--adj[c]==0) queue.offer(c);//入度为0的节点入队}}for(int i=0;i<numCourses;i++)if(adj[i]>0) return false;//还存在不能消除的边return true;}
leetcode207. 课程表(dfs/bfs)相关推荐
- 20天拿下华为OD笔试之【DFS/BFS】2023Q1A-开心消消乐【闭着眼睛学数理化】全网注释最详细分类最全的华为OD真题题解
[DFS/BFS]2023Q1A-开心消消乐 题目描述与示例 题目描述 给定一个 N 行 M 列的二维矩阵,矩阵中每个位置的数字取值为 0 或 1,矩阵示例如: 1 1 0 0 0 0 0 1 0 0 ...
- 【限时免费】20天拿下华为OD笔试之【DFS/BFS】2023B-寻找最大价值的矿堆【闭着眼睛学数理化】全网注释最详细分类最全的华为OD真题题解
[DFS/BFS]2023B-寻找最大价值的矿堆 题目描述与示例 给你一个由 '0'(空地).'1'(银矿).'2'(金矿)组成的的地图,矿堆只能由上下左右相邻的金矿或银矿连接形成.超出地图范围可以认 ...
- 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)
[题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...
- POJ2308连连看dfs+bfs+优化
DFS+BFS+MAP+剪枝 题意: 就是给你一个10*10的连连看状态,然后问你最后能不能全部消没? 思路: 首先要明确这是一个搜索题目,还有就是关键的一点就是连连看这个游戏是 ...
- 链式前向星模板 建图+dfs+bfs+dijkstra
边没有用struct封装起来,节点和边的计数起点如果不符合习惯可以稍作修改 建图+DFS+BFS #include <cstdio> #include <cstring> #i ...
- 算法 - DFS/BFS
DFS函数大概率会传递"位置信息",根据位置信息获取下一步的选择,(大部分是在循环中)选择.执行.回退 例如N皇后的 棋盘位置(x, y),组合问题的 idx DFS函数的目的是, ...
- [Leetcode][第130题][JAVA][被围绕的区域][DFS][BFS]
[问题描述][中等] [解答思路] 1. 深度优先搜索 使用深度优先搜索实现标记操作.在下面的代码中,我们把标记过的字母 O 修改为字母 A. 复杂度 class Solution {int[] dx ...
- 1.5万字详述 | 全开源:python写小游戏+AI强化学习与传统DFS/BFS控制分别实现
简介:本周的强化学习我们来到实践部分.我以我在 GitHub 上开源的项目 PiperLiu / Amazing-Brick-DFS-and-DRL 为对象,从零开始与各位朋友分享:如何用 pytho ...
- java bfs dfs_java优先搜索(DFS/BFS)实际应用
深度优先搜索DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.广度优先搜索BFS是Breadth First Sear ...
- 洛谷 P1710 地铁涨价 (dfs+bfs)
地铁涨价 题目描述 博艾市除了有海底高铁连接中国大陆.台湾与日本,市区里也有很成熟的轨道交通系统.我们可以认为博艾地铁系统是一个无向连通图.博艾有N个地铁站,同时有M小段地铁连接两个不同的站. 地铁计 ...
最新文章
- 网络设置计算机,怎么重置电脑网络设置
- 读书笔记之《习惯的力量》
- Perl中的单行凝视和多行凝视
- C#-微信公众平台接口-上传临时素材
- java 队列的数组_JAVA-循环数组实现简单的队列
- LeetCode 1049. 最后一块石头的重量 II
- Lambda表达式的注意事项【理解】
- iWiscloud智慧家居控制中心
- [Jinkey 原创]震惊!iOS 系统居然自带悬浮窗口调试工具
- 华为鸿蒙发布2.0,华为做到了!鸿蒙2.0正式发布,苹果安卓有危机?
- android numberpicker,NumberPicker实现滑动选择
- 【李宏毅2020 ML/DL】P56 Transformer and its variant | New Architecture
- 纵向合并gridview单元格的两种方法
- OpenCV中对Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解
- QTP/UFT11.5官方下载与安装教程及汉化
- qq android 哪个版本好用吗,Android QQ轻聊版好用吗?
- android 重装系统,如何用手机给电脑重装系统
- Elastic Weight Consolidation(EWC) for Life long Learning
- activity已经销毁判断
- 血淋淋的经验!2021做亚马逊测评是搭上末班车?还是成为新韭菜?