课程表系列(BFS)

广度优先搜索

文章目录

  • 广度优先搜索
    • 207. 课程表
    • 210. 课程表 II
      • 思路
    • 630. 课程表 III
    • 1462. 课程表 IV
    • 547. 省份数量

207. 课程表

207. 课程表

你这个学期必须选修 numCourses 门课程,记为 0numCourses - 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 。这是不可能的。
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {List<List<Integer>> list=new ArrayList<List<Integer>>();//邻接表存图for(int i=0;i<numCourses;i++)list.add(new ArrayList<>());int[] indeg=new int[numCourses];//入度数组,下标对应结点for(int i=0;i<prerequisites.length;i++){list.get(prerequisites[i][0]).add(prerequisites[i][1]);//创建邻接表indeg[prerequisites[i][1]]++;//入度+1}Queue<Integer> queue=new LinkedList<>();//遍历时,用于存每个结点的队列,这里的结点形式是在邻接表中对应的下标//寻找入度为0的结点,当作起点加入队列中for(int i=0;i<numCourses;i++){if(indeg[i]==0)queue.add(i);}//bfs部分while(!queue.isEmpty()){//将出度为0的结点全部出队for(int i=queue.size();i>0;i--){//获取结点的下标,并出队Integer node=queue.poll();//遍历该结点到达了哪些结点,并将那些结点入度-1;for(Integer j:list.get(node)){indeg[j]--;//可以学习该课程了,入队if(indeg[j]==0){queue.add(j);}}}}//最后判断入度数组是否全为0for(int i=0;i<numCourses;i++){if(indeg[i]!=0)return false;}return true;}
}

210. 课程表 II

210. 课程表 II

现在你总共有 numCourses 门课需要选,记为 0numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在选修课程 ai必须 先选修 bi

  • 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示:[0,1]

返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回 任意一种 就可以了。如果不可能完成所有课程,返回 一个空数组

示例 1:

输入:numCourses = 2, prerequisites = [[1,0]]
输出:[0,1]
解释:总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为 [0,1]

思路

本题与课程表1很相似,唯一区别:只是改了学习箭头反过来了,然后在层序遍历的同时将遍历的结点存起来

class Solution {public int[] findOrder(int numCourses, int[][] prerequisites) {List<List<Integer>> list=new ArrayList<List<Integer>>();//邻接表存图int[] res=new int[numCourses];//学习课程顺序for(int i=0;i<numCourses;i++)list.add(new ArrayList<>());int[] indeg=new int[numCourses];//入度数组,下标对应结点for(int i=0;i<prerequisites.length;i++){list.get(prerequisites[i][1]).add(prerequisites[i][0]);//创建邻接表indeg[prerequisites[i][0]]++;//入度+1}Queue<Integer> queue=new LinkedList<>();//遍历时,用于存每个结点的队列,这里的结点形式是在邻接表中对应的下标//寻找入度为0的结点,当作起点加入队列中for(int i=0;i<numCourses;i++){if(indeg[i]==0)queue.add(i);}//bfs部分int index=0;while(!queue.isEmpty()){//将出度为0的结点全部出队for(int i=queue.size();i>0;i--){//获取结点的下标,并出队Integer node=queue.poll();res[index++]=node;//遍历该结点到达了哪些结点,并将那些结点入度-1;for(Integer j:list.get(node)){indeg[j]--;//可以学习该课程了,入队if(indeg[j]==0){queue.add(j);}}}}for(int i=0;i<numCourses;i++){if(indeg[i]!=0)return new int[]{};}return res;}
}

630. 课程表 III

630. 课程表 III

这里有 n 门不同的在线课程,按从 1n 编号。给你一个数组 courses ,其中 courses[i] = [durationi, lastDayi] 表示第 i 门课将会 持续durationi 天课,并且必须在不晚于 lastDayi 的时候完成。

你的学期从第 1 天开始。且不能同时修读两门及两门以上的课程。

返回你最多可以修读的课程数目。

示例 1:

输入:courses = [[100, 200], [200, 1300], [1000, 1250], [2000, 3200]]
输出:3
解释:
这里一共有 4 门课程,但是你最多可以修 3 门:
首先,修第 1 门课,耗费 100 天,在第 100 天完成,在第 101 天开始下门课。
第二,修第 3 门课,耗费 1000 天,在第 1100 天完成,在第 1101 天开始下门课程。
第三,修第 2 门课,耗时 200 天,在第 1300 天完成。
第 4 门课现在不能修,因为将会在第 3300 天完成它,这已经超出了关闭日期。
import java.util.Arrays;
import java.util.PriorityQueue;//leetcode submit region begin(Prohibit modification and deletion)
class Solution {public int scheduleCourse(int[][] courses) {Arrays.sort(courses,(a,b)->a[1]-b[1]);PriorityQueue<Integer> queue=new PriorityQueue<>((a,b)->b-a);//耗时时间从大到小进行排序int s=0;for(int[] a:courses){int b=a[0],e=a[1];queue.add(b);s+=b;while(s>e){s-=queue.poll();}}return queue.size();}
}

1462. 课程表 IV

1462. 课程表 IV

你总共需要上 numCourses 门课,课程编号依次为 0numCourses-1 。你会得到一个数组 prerequisite ,其中 prerequisites[i] = [ai, bi] 表示如果你想选 bi 课程,你 必须 先选 ai 课程。

  • 有的课会有直接的先修课程,比如如果想上课程 1 ,你必须先上课程 0 ,那么会以 [0,1] 数对的形式给出先修课程数对。

先决条件也可以是 间接 的。如果课程 a 是课程 b 的先决条件,课程 b 是课程 c 的先决条件,那么课程 a 就是课程 c 的先决条件。

你也得到一个数组 queries ,其中 queries[j] = [uj, vj]。对于第 j 个查询,您应该回答课程 uj 是否是课程 vj 的先决条件。

返回一个布尔数组 answer ,其中 answer[j] 是第 j 个查询的答案。

示例 1:

img

输入:numCourses = 2, prerequisites = [[1,0]], queries = [[0,1],[1,0]]
输出:[false,true]
解释:课程 0 不是课程 1 的先修课程,但课程 1 是课程 0 的先修课程。

示例 2:

输入:numCourses = 2, prerequisites = [], queries = [[1,0],[0,1]]
输出:[false,false]
解释:没有先修课程对,所以每门课程之间是独立的。
import java.util.*;class Solution {public List<Boolean> checkIfPrerequisite(int numCourses, int[][] prerequisites, int[][] queries) {int[] indeg=new int[numCourses];List<Boolean> res=new ArrayList<>();Boolean[][] grid=new Boolean[numCourses][numCourses];List<List<Integer>> list = new ArrayList<List<Integer>>();//邻接表存图for (int i = 0; i < numCourses; i++) {list.add(new ArrayList<>());grid[i]=new Boolean[numCourses];Arrays.fill(grid[i],false);}for (int i = 0; i < prerequisites.length; i++) {list.get(prerequisites[i][0]).add(prerequisites[i][1]);indeg[prerequisites[i][1]]++;}Queue<Integer> queue = new LinkedList<>();//先将入度为0入队for (int i = 0; i < numCourses; i++) {if (indeg[i] == 0)queue.add(i);}while (!queue.isEmpty()) {for (int i = queue.size(); i > 0; i--) {Integer node = queue.poll();for (Integer j : list.get(node)) {grid[node][j]=true;for(int k=0;k<numCourses;k++){grid[k][j]=grid[k][j] || grid[k][node];}indeg[j]--;if (indeg[j] == 0) queue.add(j);}}}for(int[] a:queries){res.add(grid[a[0]][a[1]]);}return res;}}

547. 省份数量

547. 省份数量

n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。

省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。

给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。

返回矩阵中 省份 的数量。

示例 1:

img

输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]
输出:2
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;//leetcode submit region begin(Prohibit modification and deletion)
class Solution {public int findCircleNum(int[][] isConnected) {int n=isConnected.length;List<List<Integer>> grid=new ArrayList<>();//邻接表//存图for(int i=0;i<n;i++) {grid.add(new ArrayList<>());for (int j = 0; j < n; j++) {if (isConnected[i][j] == 1)grid.get(i).add(j);}}boolean[] visit=new boolean[n];int res=0;for(int i=0;i<n;i++){Queue<Integer> queue=new LinkedList<>();if(visit[i]==false){res++;visit[i]=true;queue.add(i);//bsf部分while(!queue.isEmpty()){Integer node=queue.poll();//遍历该结点连接的结点for(Integer j:grid.get(node)){if(!visit[j])queue.add(j);visit[j]=true;}}}}return res;}
}

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

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

相关文章

【AI绘画】免费GPU Tesla A100 32G算力部署Stable Diffusion

免责声明 在阅读和实践本文提供的内容之前&#xff0c;请注意以下免责声明&#xff1a; 侵权问题: 本文提供的信息仅供学习参考&#xff0c;不用做任何商业用途&#xff0c;如造成侵权&#xff0c;请私信我&#xff0c;我会立即删除&#xff0c;作者不对读者因使用本文所述方法…

Matlab 机器人工具箱 RobotArm类

文章目录 1 RobotArm1.1 方法1.2 注意2 RobotArm.RobotArm3 RobotArm.cmove4 其他官网:Robotics Toolbox - Peter Corke 1 RobotArm 串联机械臂类 1.1 方法 方法描述plot显示机器人的图形表示teach驱动物理和图形机器人mirror使用机器人作为从机来驱动图形</

深入了解Kafka的文件存储原理

Kafka简介 Kafka最初由Linkedin公司开发的分布式、分区的、多副本的、多订阅者的消息系统。它提供了类似于JMS的特性&#xff0c;但是在设计实现上完全不同&#xff0c;此外它并不是JMS规范的实现。kafka对消息保存是根据Topic进行归类&#xff0c;发送消息者称为Producer&…

梯度下降算法(带你 原理 实践)

目录 一、引言 二、梯度下降算法的原理 三、梯度下降算法的实现 四、梯度下降算法的优缺点 优点&#xff1a; 缺点&#xff1a; 五、梯度下降算法的改进策略 1 随机梯度下降&#xff08;Stochastic Gradient Descent, SGD&#xff09; 2 批量梯度下降&#xff08;Batch…

(一)Python数据分析体系--九五小庞

课程地址&#xff1a;https://space.bilibili.com/387143299/channel/collectiondetail?sid554734 主要内容 知识体系 分析什么样的数据 为什么使用Python做数据分析 Python近几年的发展势头是有目共睹的&#xff0c;尤其是在科学计算&#xff0c;数据处理&#xff0c;A方面…

驾辰龙跨Llama持Wasm,玩转Yi模型迎新春

今年新年很特别&#xff0c;AI工具添光彩。今天就来感受下最新的AI神器天选组合“WasmEdgeYi-34B”&#xff0c;只要短短三步&#xff0c;为这个甲辰龙年带来一份九紫离火运的科技感。 环境准备 这次用的算力是OpenBayes提供的英伟达RTX_4090*1、24GB显存、20核CPU、80GB内存…

产品营销展示型wordpress外贸网站模板

工艺品wordpress外贸主题 简约大气的wordpress外贸主题&#xff0c;适合做工艺品进出品外贸的公司官网使用。 https://www.jianzhanpress.com/?p5377 餐饮设备wordpress外贸主题 简洁的wordpress外贸主题&#xff0c;适合食品机械、餐饮设备公司使用。 https://www.jianzh…

Linux 开发工具vim、gcc/g++、makefile

目录 Linux编辑器-vim 1. 基本概念 2. 基本操作 3. 正常模式命令集 4. 末行模式命令集 5. 其他操作 6. 简单vim配置 Linux编译器-gcc/g 1、基本概念 2、程序翻译的过程 3. gcc如何完成程序翻译 4、动静态库 Linux项目自动化构建工具-make/Makefile 1、背景 2、…

【Qt学习笔记】(四)Qt窗口

Qt窗口 1 菜单栏1.1 创建菜单栏1.2 在菜单栏中添加菜单1.3 创建菜单项1.4 在菜单项之间添加分割线1.5 给菜单项添加槽函数1.6 给菜单项添加快捷键 2 工具栏2.1 创建工具栏2.2 设置停靠位置2.3 设置浮动属性2.4 设置移动属性2.5 添加 Action 3 状态栏3.1 状态栏的创建3.2 在状态…

2024最新算法:冠豪猪优化算法(CPO)求解23个基准函数

一、冠豪猪优化算法 冠豪猪优化算法(Crested Porcupine Optimizer&#xff0c;CPO)由Mohamed Abdel-Basset等人于2024年提出&#xff0c;该算法模拟冠豪猪的四种不同保护机制&#xff1a;视觉、听觉、气味和物理攻击。第一和第二防御技术&#xff08;视觉和听觉&#xff09;反…

盘点 | IT行业哪些认证含金量高

微思网络 厦门微思网络 作为一名IT人员&#xff0c;谁没考几个证 ——值得考的证书拥有的特性 ▶ 获政府、企业和从业者认可&#xff1b; ▶ 持证人数多&#xff0c;业内共识度高&#xff1b; ▶ 帮持证者加分&#xff0c;快速提薪。 系统网络方向认证 01 华为认证 华为…

【机器学习】包裹式特征选择之递归特征消除法

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

电磁兼容(EMC):电解电容低阻如何选择详解

目录 1 为何要选低阻电解电容 2 电解电容等效高频等效电路 3 不同厂家ESR参数 4 高频ESR特性 5 Low ESR铝电解电容 1 为何要选低阻电解电容 在EMI超标时&#xff0c;将普通电解电容更换为低阻电解电容时&#xff0c;便通过了。这是因为低阻电解电容降低了功率回路的辐射电…

数字化转型导师坚鹏:证券公司数字化转型战略、方法与案例

证券公司数字化转型战略、方法与案例 课程背景&#xff1a; 数字化转型背景下&#xff0c;很多机构存在以下问题&#xff1a; 不清楚证券公司数字化转型的发展战略&#xff1f; 不知道证券公司数字化转型的核心方法&#xff1f; 不知道证券公司数字化转型的成功案例&am…

LLM 系列——BERT——论文解读

一、概述 1、是什么 是单模态“小”语言模型&#xff0c;是一个“Bidirectional Encoder Representations fromTransformers”的缩写&#xff0c;是一个语言预训练模型&#xff0c;通过随机掩盖一些词&#xff0c;然后预测这些被遮盖的词来训练双向语言模型&#xff08;编码器…

【计算机网络通信】计算机之间的局域网通信和互联网通信方法(附Python和C#代码)

文章目录 前言一、局域网通信1.1 基本原理和方法1.1.1 获取本地ip1.1.2 实现局域网内的广播1.1.3 进行局域网通信 1.2 实现多客户端连接1.3 Python源码1.4 C#源码1.5 可能存在的问题 二、互联网通信2.1 实现原理2.1.1 内网穿透软件2.1.2 实现互联网通信 2.2 Python源码2.3 C#源…

基于Java的超市商品管理系统(Vue.js+SpringBoot)

目录 一、摘要1.1 简介1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 超市区域模块2.3 超市货架模块2.4 商品类型模块2.5 商品档案模块 三、系统设计3.1 用例图3.2 时序图3.3 类图3.4 E-R图 四、系统实现4.1 登录4.2 注册4.3 主页4.4 超市区域管理4.5 超市货架管理4.6 商品类型…

一文了解docker与k8s

随着 k8s 作为容器编排解决方案变得越来越流行&#xff0c;有些人开始拿 Docker 和 k8s 进行对比&#xff0c;不禁问道&#xff1a;Docker 不香吗&#xff1f; k8s 是 kubernetes 的缩写&#xff0c;8 代表中间的八个字符。 其实 Docker 和 k8s 并非直接的竞争对手两者相互依存…

Qt外部调用进程类QProcess的使用

有的时候我们需要在自己程序运行过程中调用其他进程&#xff0c;那么就需要用到QProcess。 首先可以了解一些关于进程的相关知识&#xff1a;线程与进程&#xff0c;你真得理解了吗_进程和线程的区别-CSDN博客 进程是计算机中的程序关于某数据集合上的一次运行活动&#xff0…

Java面试——Redis

优质博文&#xff1a;IT-BLOG-CN 一、Redis 为什么那么快 【1】完全基于内存&#xff0c;绝大部分请求是纯粹的内存操作&#xff0c;非常快速。数据存在内存中。 【2】数据结构简单&#xff0c;对数据操作也简单&#xff0c;Redis中的数据结构是专门进行设计的。 【3】采用单线…