课程表系列(BFS)

news2024/9/29 19:19:16

广度优先搜索

文章目录

  • 广度优先搜索
    • 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);
                    }
                }
            }
        }
        //最后判断入度数组是否全为0
        for(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.coloradmin.cn/o/1485488.html

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

相关文章

多元函数积分思路合集

[曲线积分笔记]第一类曲线积分 [微积分笔记]第二类曲线/面积分总结 积分方法意义/提示平面第二型曲线积分化为定积分 ∮ L → ∫ a b \oint_L \to \int_a^b ∮L​→∫ab​平面第二型曲线积分格林公式 ∮ L → ∬ D \oint_L \to \iint_D ∮L​→∬D​化为对平面区域的二重积分空…

百度搜索引擎SEO优化方法

随着互联网的不断发展&#xff0c;搜索引擎已经成为人们获取信息、产品和服务的主要途径之一。而在中国&#xff0c;百度作为最大的搜索引擎&#xff0c;其影响力不可忽视。了解并掌握百度SEO关键词优化方法&#xff0c;对于提升网站在搜索引擎中的排名至关重要。 关键词选择&a…

chatgpt-3的文章生成器有哪些?可以批量生成文章的生成器

GPT-3&#xff08;Generative Pre-trained Transformer 3&#xff09;作为人工智能领域的一项重大突破&#xff0c;开启了新一代的文本生成技术。同时市面上也涌现出了一些GPT-3文章生成器&#xff0c;为用户提供了快速、高效地生成各种类型文章的工具。本文将介绍一些中国的GP…

JS:原型与原型链(附带图解与代码)

一、原型 写在前面&#xff1a; 任何对象都有原型。 函数也是对象&#xff0c;所以函数也有原型。 1.什么是原型 在 JavaScript 中&#xff0c;对象有一个特殊的隐藏属性 [[Prototype]]&#xff0c;它要么为 null&#xff0c;要么就是对另一个对象的引用&#xff0c;该对象…

MATLAB基于隐马尔可夫模型-高斯混合模型-期望最大化的MR图像分割

隐马尔可夫模型是一种统计模型&#xff0c;它描述了马尔可夫过程&#xff0c;隐马尔可夫过程中包含隐变量&#xff0c;语音识别和词性自动标注等一些领域常常使用隐马尔可夫模型方法来处理。马尔可夫过程是一类随机过程&#xff0c;马尔可夫链是它的原始模型&#xff0c;马尔可…

《OpenScene: 3D Scene Understanding with Open Vocabularies》阅读笔记1

传统的3D场景理解方法依赖于带标签的3D数据集,用于训练一个模型以进行单一任务的监督学习。我们提出了OpenScene,一种替代方法,其中模型在CLIP特征空间中预测与文本和图像像素共同嵌入的3D场景点的密集特征。这种零样本方法实现了与任务无关的训练和开放词汇查询。例如,为了…

03-JNI 类型和数据结构

上一篇&#xff1a; 02-设计概述 本章讨论 JNI 如何将 Java 类型映射为本地 C 类型。 3.1 原始类型 下表描述了 Java 原始类型及其与机器相关的本地等价类型。 为方便起见&#xff0c;定义如下&#xff1a; #define JNI_FALSE 0 #define JNI_TRUE 1 jsize 整数类型用于描述…

《Spring Security 简易速速上手小册》第8章 常见问题与解决方案(2024 最新版)

文章目录 8.1 异常处理和日志记录8.1.1 基础知识详解8.1.2 重点案例&#xff1a;统一异常处理案例 Demo拓展 8.1.3 拓展案例 1&#xff1a;日志记录策略案例 Demo拓展 8.1.4 拓展案例 2&#xff1a;日志聚合案例 Demo拓展 8.2 多租户安全性问题8.2.1 基础知识详解8.2.2 重点案例…

Redis之十:Spring Data Redis --- CrudRepository方式

SpringData Redis CrudRepository方式 Spring Data Redis 的 CrudRepository 是 Spring Data 框架中用于提供基础 CRUD&#xff08;创建、读取、更新和删除&#xff09;操作的一个接口。在与 Redis 集成时&#xff0c;尽管 Redis 是一个键值存储系统&#xff0c;并没有像关系型…

STM32使用FlyMcu串口下载程序与STLink Utility下载程序

文章目录 前言软件链接一、FlyMcu串口下载程序原理优化手动修改跳线帽选项字节其他功能 二、STLink Utility下载程序下载程序选项字节固件更新 前言 本文主要讲解使用FlyMcu配合USART串口为STM32下载程序、使用STLink Utility配合STLink为STM32下载程序&#xff0c;以及这两个…

javascript中对包含关系判断介绍

本文将为您详细讲解 JavaScript 中对包含关系的判断&#xff0c;包括数组、字符串等&#xff0c;并提供相应的代码例子。 1. 数组包含关系判断 在 JavaScript 中&#xff0c;数组包含关系判断通常使用 Array.prototype.includes() 方法。这个方法返回一个布尔值&#xff0c;表示…

C语言第三十四弹---动态内存管理(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 动态内存管理 1、动态内存经典笔试题分析 1.1、题目1 1.2、题目2 1.3、题目3 1.4、题目4 2、柔性数组 2.1、柔性数组的特点 2.2、柔性数组的使用 2.3、…

7、Bluecms代码审计

一、sql注入 环境 流程:将bluecms文件夹放到WWW中,访问文件中的install(安装文件)&#xff0c;安装后可以删掉成功后直接访问bluecms目录即可后台访问报错解决。在php.ini配置文件里找到。关闭后记得重启phpstudy display_errors off建议删除安装文件或者将文件名更改1、sql…

【javaSE-语法】lambda表达式

【javaSE-语法】lambda表达式 1. 先回忆一下&#xff1a;1.1 接口不能直接通过关键字new进行实例化1.2 函数式接口1.3 匿名内部类1.31 匿名内部类在代码中长啥样&#xff1f;1.32 构造一个新的对象与构造一个扩展了某类的匿名内部类的对象&#xff0c;两者有什么区别&#xff1…

Bert基础(五)--解码器(下)

1、 多头注意力层 下图展示了Transformer模型中的编码器和解码器。我们可以看到&#xff0c;每个解码器中的多头注意力层都有两个输入&#xff1a;一个来自带掩码的多头注意力层&#xff0c;另一个是编码器输出的特征值。 让我们用R来表示编码器输出的特征值&#xff0c;用M来…

visio、ppt、office等另存图片,如何设置更清晰

visio、ppt、office等另存图片&#xff0c;如何设置更清晰 选中要另存为的部分——文件——另存为——选好位置——格式选jpg——保存——按下图设置&#xff1a;质量100%&#xff0c;分辨率选打印机&#xff0c;大小选屏幕——确定

MySQL 教程 2.4

MySQL UNION 操作符 本教程为大家介绍 MySQL UNION 操作符的语法和实例。 描述 MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合&#xff0c;并去除重复的行。 UNION 操作符必须由两个或多个 SELECT 语句组成&#xff0c;每个 SELECT 语句的列数…

盘点实用又有意思的工具网站-搜嗖工具箱

生命倒计时 www.thismuchlonger.com 这是一个相哇塞的网站&#xff0c;可以让我们静下心来好好想想我们来这个世界究竟为了什么&#xff0c;因为当我们作为命运的主宰者。敲打键盘设定好自己一生长度的时候&#xff0c;我们的剩余寿命已经成绝对值&#xff0c;一旦生命变为了绝…

测试:腾讯云4核8G服务器支持多少人在线访问?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

【JavaScript 漫游】【028】拖拉事件

文章简介 本篇文章为【JavaScript 漫游】专栏的第 027 篇文章&#xff0c;主要记录了 JavaScript 中拖拉事件的知识点。 拖拉事件的种类 拖拉&#xff08;drag&#xff09;指的是&#xff0c;用户在某个对象上按下鼠标键不放&#xff0c;拖动它到另一个位置&#xff0c;然后…