刷题笔记25——图论课程表

2023-09-20 22:04:09

为了最终理解你所不理解的,你必须经历一条愚昧无知的道路。为了占有你从未占有的东西,你必须经历被剥夺的道路。为了达到你现在所不在的名位,你必须经历那条你不在其中的道路。——艾略特

797. 所有可能的路径(已经告知:是有向无环图,所以不需要设置visited)

  • 非常奇妙,我最初的错误是如下,在找到目标节点后直接加入到res中,但是发现结果输出的数量是对的,但是都是空的
  • 可能的原因是:path就算被加入到res中,但是只是加入了地址,后序path的修改还是会影响到res
  • 修改:在加入 res 的时候新建空间,问题解决
		if(n == sz-1){
            res.add(result);
        }
class Solution {
    List<Integer> path = new LinkedList<>();
    List<List<Integer>> res = new LinkedList<List<Integer>>();
    public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
        traverse(graph,0);
        return res;
    }

    void traverse(int[][] graph,int n){
        path.add(n);
        int sz = graph.length;
        if(n == sz-1){
            List<Integer> result = new LinkedList<>(path);
            res.add(result);
        }
        else{
            for(int node:graph[n]){
                traverse(graph,node);
            }
        }
        path.remove(path.size()-1);
    }
}
  • 比如我们写代码 import 包也是一个例子,必须合理设计代码目录结构,否则会出现循环依赖,编译器会报错,所以编译器实际上也使用了类似算法来判断你的代码是否能够成功编译。看到依赖问题,首先想到的就是把问题转化成「有向图」这种数据结构,只要图中存在环,那就说明存在循环依赖。

207. 课程表

  • visited是以整个图为维度判断是否重复遍历,onPath是以路径为维度判断是否有环,区别在于后续遍历的处理。两者不能互相替代。
  • 目前感觉最大的问题就是对数据类型的定义,像graph要用什么类型来存,以及graph如果是两层的话,那么需要对下一层再进行new
  • arraylist和linkedlist都可以用,功能也相近,但是要看具体算法中,是更多索引操作还是增删操作
  • 其余的话就都是照抄板子
List<Integer>[] graph = new LinkedList[numCourses];
for(int i=0;i<numCourses;i++){
	graph[i] = new LinkedList<>();
}
class Solution {
    boolean[] visited;
    boolean[] path;
    boolean isCycle = false;

    public boolean canFinish(int numCourses, int[][] prerequisites) {
        List<Integer>[] graph = generateGraph(numCourses,prerequisites);
        visited = new boolean[numCourses];
        path = new boolean[numCourses];
        for(int i=0;i<numCourses;i++){
            traverse(graph,i);   
        }
        return !isCycle;
    }

    void traverse(List<Integer>[] graph,int n){
        if(path[n]){
            isCycle = true;
        }
        if(visited[n]||isCycle){
            return;
        }
        visited[n] = true;
        path[n] = true;
        for(int node:graph[n]){
            traverse(graph,node);
        }
        path[n] = false;
    }

    List<Integer>[] generateGraph(int numCourses, int[][] prerequisites){
        List<Integer>[] graph = new LinkedList[numCourses];
        for(int i=0;i<numCourses;i++){
            graph[i] = new LinkedList<>();
        }
        for(int i=0;i<prerequisites.length;i++){
            graph[prerequisites[i][1]].add(prerequisites[i][0]);
        }
        return graph;
    }
}

210. 课程表 II (有点像不明白为什么是在后序遍历那块记录路径,可能就是后序的时候,可以保证每个节点的前导节点已经遍历过了)

class Solution {
    boolean[] visited;
    boolean[] path;
    int[] res;
    boolean isCycle = false;
    int i=0;

    public int[] findOrder(int numCourses, int[][] prerequisites) {
        List<Integer>[] graph = generateGraph(numCourses,prerequisites);
        visited = new boolean[numCourses];
        path = new boolean[numCourses];
        res = new int[numCourses];
        for(int i=0;i<numCourses;i++){
            traverse(graph,i);
        }

        if(!isCycle){
            int[] result = new int[numCourses];
            for(int i=0;i<numCourses;i++){
                result[i] = res[numCourses-i-1];
            }
            return result;
        }else{
            return new int[]{};
        }
        
    }

    void traverse(List<Integer>[] graph,int n){
        if(path[n]){
            isCycle = true;
        }
        if(path[n] || visited[n]){
            return;
        }

        visited[n] = true;
        path[n] = true;
        
        for(int node:graph[n]){
            traverse(graph,node);
        }
        path[n] = false;
        res[i] = n;
        i++;
    }

    List<Integer>[] generateGraph(int numCourses, int[][] prerequisites){
        List<Integer>[] graph = new LinkedList[numCourses];
        for(int i=0;i<numCourses;i++){
            graph[i] = new LinkedList();
        }

        for(int i=0;i<prerequisites.length;i++){
            graph[prerequisites[i][1]].add(prerequisites[i][0]);
        }
        return graph;
    }


}
更多推荐

Vue实现大文件分片上传、断点续传

前言实现大文件分片上传的断点续传以及上传进度条是一个在前端开发中常见且具有挑战性的问题。本篇博客将介绍如何使用Vue框架来实现这个功能,并给出代码示例。概述大文件分片上传指的是将一个大文件切割成多个小文件(或称为分片),然后依次上传这些小文件,最后在服务器端将这些小文件合并为原始的大文件。断点续传则是在上传过程中遇到意

如何识别和解决PPPoE宽带连接的硬件故障

各位的爬虫大佬们!当你们在使用PPPoE连接时,偶尔会遇到硬件故障导致的连接问题。今天,我将为你提供一些有用的指导,帮助你识别和解决PPPoE连接中可能出现的硬件故障。第一步是确定故障的源头。以下是一些常见的硬件故障情况和对应的解决方法:1、网线故障有时候,连接问题可能由于网线出现故障而引起。首先,检查网线是否插好连接

git常用命令 Git常用命令 git常用操作 git 操作

git常用命令Git常用命令git常用操作git操作示例仓库地址初始化本地仓库克隆仓库代码查看当前仓库的状态,包括已修改但未提交的文件添加提交文件提交更改查看提交历史记录查看分支列表切换分支合并一个指定的分支到当前分支拉取远程仓库最新代码推送到远程仓库推送到指定远程仓库示例仓库地址仓库地址:https://github

LVS+Keepalived 高可用集群

LVS+Keepalived高可用集群1、Keepalived工具介绍2、vrrp协议(虚拟路由冗余协议)2.1vrrrp是什么?2.2vrrp工作过程2.3Keeplived、VRRP及其工作原理2.4Keepalived体系主要模块3、搭建LVS+Keepalived高可用集群1、Keepalived工具介绍支持故

用 Github Codespaces 免费搭建本地开发测试环境

如何丝滑地白嫖一个本地开发环境?怎么新建一个代码空间?1:通过Github网页新建2:通过VSCode插件新建为代码创建相应的开发测试环境如何丝滑地白嫖一个本地开发环境?使用Codespaces为开发者解决这样的痛点:为项目设置和维护一个或一组开发工作站。在“第一次提交”发生之前浪费的时间。开发工作站之间的配置/工具/

基于模型驱动的深度学习高光谱图像融合研究_孙杨霖

可以借鉴一下她的国内外现状研究部分,写得挺好的目前的高光谱图像融合方法可以大致分为三类:传统数学方法(成分替代和多分辨率分析)、变分方法(贝叶斯、矩阵分析)以及基于深度学习(输入级、特征级和模型级融合)的方法。其中前两种方法也可以被统称为传统高光谱图像融合方法。成分替代法,把LRHSI投影到更高维的空间,分离空间信息和

第一章 SQL Server 数据库部署

个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。个人主页:小李会科技的主页目录一数据库介绍(1)使用数据库的必要性(2)数据库的基本概念1.数据2.数据库和数据库表3.数据库系统和数据库管理系统(3)数据库的发展史(4

React中的Hooks--useReducer()

首先,useReducer是React提供的一个钩子函数,用于管理组件内部的状态。它可以接收一个reducer函数和初始状态,并返回一个包含状态和更新状态的函数的数组。与之相反,Redux是一个独立的状态管理库,它可以在整个应用程序中实现数据共享。Redux使用一个全局的状态树(store)来存储应用程序的状态,并通过

数据库索引

一、索引是什么?索引是帮助MySQL高效获取数据的数据结构。二、索引能干什么?索引非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。索引能够轻易将查询性能提高好几个数量级,总的来说就是可以明显的提高查询效率。三、索引的分类?从存储结构上来划分:BTree索引(B-Tree或B+Tree索引),Has

19异常的学习笔记

异常很重要,有利于我们平时处理问题异常就是代表程序出现了问题常见的异常比如说数组越界除法除0异常的体系是什么java.lang.ThrowableErrorExceptionRuntimeException其他异常Error代表的是系统级别的错误,也就是一旦系统出现问题,sun公司会把这些问题封装程Error对象出来E

Vue模板语法(下)

事件处理器<!DOCTYPEhtml><html><head><metacharset="utf-8"><title></title><scriptsrc="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script><scriptsrc

热文推荐