首页 > 其他分享 >Leetcode 802. 找到最终的安全状态

Leetcode 802. 找到最终的安全状态

时间:2024-10-17 14:48:22浏览次数:9  
标签:node 找到 graph length 节点 subNode colors 802 Leetcode

1.题目基本信息

1.1.题目描述

有一个有 n 个节点的有向图,节点按 0 到 n – 1 编号。图由一个 索引从 0 开始 的 2D 整数数组 graph表示, graph[i]是与节点 i 相邻的节点的整数数组,这意味着从节点 i 到 graph[i]中的每个节点都有一条边。

如果一个节点没有连出的有向边,则该节点是 终端节点 。如果从该节点开始的所有可能路径都通向 终端节点 ,则该节点为 安全节点 。

返回一个由图中所有 安全节点 组成的数组作为答案。答案数组中的元素应当按 升序 排列。

1.2.题目地址

https://leetcode.cn/problems/find-eventual-safe-states/description/

2.解题方法

2.1.解题思路

逆向拓扑排序法 / DFS+三色染色法

2.2.解题步骤

DFS+三色染色法

  • 第一步,定义并初始化各个节点的颜色。colors[i]==0,表示白色,还没有访问过;等于1,表示灰色,在递归栈中待着;等于2,黑色,安全的
  • 第二步,构建dfs递归函数。递归任务:返回节点node是否安全
  • 第三步,执行递归,将各个未访问的节点的颜色进行标记,并根据最终的标记颜色返回结果

逆向拓扑排序法

  • 第一步,构建逆向图
  • 第二步,拓扑排序
  • 第三步,将拓扑排序的节点升序排列

3.解题代码

Python代码(逆向拓扑排序法)

from collections import defaultdict,deque

class Solution:
    # 逆向拓扑排序法
    def eventualSafeNodes(self, graph: List[List[int]]) -> List[int]:
        length=len(graph)
        # 第一步,构建逆向图
        reverseGraph={i:[] for i in range(length)}
        inDegrees=defaultdict(int)
        for i in range(length):
            for node in graph[i]:
                reverseGraph[node].append(i)
                inDegrees[i]+=1
        # 第二步,拓扑排序
        result=[]
        que=deque()
        for node in reverseGraph.keys():
            if inDegrees[node]==0:
                que.append(node)
                result.append(node)
        while que:
            node=que.popleft()
            for subNode in reverseGraph[node]:
                inDegrees[subNode]-=1
                if inDegrees[subNode]==0:
                    que.append(subNode)
                    result.append(subNode)
        # 第三步,将拓扑排序的节点升序排列
        result.sort()
        return result

Python代码(DFS+三色染色法)

class Solution:
    # DFS+三色染色法
    def eventualSafeNodes(self, graph: List[List[int]]) -> List[int]:
        length=len(graph)
        # 第一步,定义并初始化各个节点的颜色。colors[i]==0,表示白色,还没有访问过;等于1,表示灰色,在递归栈中待着;等于2,黑色,安全的
        colors=[0]*length
        # 第二步,构建dfs递归函数。递归任务:返回节点node是否安全
        def dfs(node):
            if colors[node]!=0:
                return colors[node]==2
            colors[node]=1
            for subNode in graph[node]:
                if not dfs(subNode):
                    return False
            colors[node]=2
            return True
        # 第三步,执行递归,将各个未访问的节点的颜色进行标记,并根据最终的标记颜色返回结果
        for i in range(length):
            if colors[i]==0:
                dfs(i)
        return [t for t in range(length) if colors[t]==2]

4.执行结果

在这里插入图片描述

标签:node,找到,graph,length,节点,subNode,colors,802,Leetcode
From: https://www.cnblogs.com/geek0070/p/18472321

相关文章

  • 晶尊微电子MC802单片机:专为需要多IO接口的产品设计
    MC802单片机:触控未来,8位高性能与多IO接口的完美结合MC802(2TouchKey+4I/O)MC802是由厦门晶尊微电子科技有限公司(ICman)推出的一款高性能8位单片机,它集成了2个自校正容性触摸按键和4个I/O口,专为需要多IO接口的产品设计而优化。MC802适用于多种应用场景,如遥控器、风扇、灯光控......
  • LeetCode第六题:锯齿形转换(Python)
    一.题目要求及实例将给定的字符串,转化为锯齿形。锯齿形的行数给定。按序输出转换后的字符串。二.初始思路(1)二维数组的大小竖着写入二维数组较困难,所以想到了先横着写,再取转置。首先需要知道二维数组的大小。参数中给的numRows即为行数,所以要考虑的就是二维数组的列数。......
  • 常见问题——C#未能找到路径“\bin\roslyn\csc.exe”的一部分
    1.主要原因是因为两个库存在,需要生成一个roslyn文件那么就删除这两个关联的库,就可以达到目的删去项目中的这两天引用:Microsoft.CodeDom.Providers.DotNetCompilerPlatformMicrosoft.Net.Compilers2.删除web.config中加载的这个依赖的代码段<system.codedom><compilers......
  • LeetCode 1884.鸡蛋掉落-两枚鸡蛋:动态规划
    【LetMeFly】1884.鸡蛋掉落-两枚鸡蛋:动态规划力扣题目链接:https://leetcode.cn/problems/egg-drop-with-2-eggs-and-n-floors/给你2 枚相同的鸡蛋,和一栋从第1 层到第n层共有n层楼的建筑。已知存在楼层f,满足 0<=f<=n,任何从高于f的楼层落下的鸡蛋都会......
  • leetcode算法题 437.路径总和
    题目描述给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。 示例示例1:输入:root=[10,5,-3,3,2,null,1......
  • <Leetcode:算法题及解析>最大子数组和(Javascript版)
    题目描述:给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。本题可以使用Kadane's算法实现,这是一种用于解决最大子数组和问题的高效算法。它由JosephBornKadane在1984年提出。这个算法的核......
  • Leetcode 1857. 有向图中最大颜色值
    1.题目基本信息1.1.题目描述给你一个有向图,它含有n个节点和m条边。节点编号从0到n–1。给你一个字符串colors,其中colors[i]是小写英文字母,表示图中第i个节点的颜色(下标从0开始)。同时给你一个二维数组edges,其中edges[j]=[a_j,b_j]表示从节点a_j......
  • Leetcode 1489. 找到最小生成树里的关键边和伪关键边
    1.题目基本信息1.1.题目描述给你一个n个点的带权无向连通图,节点编号为0到n-1,同时还有一个数组edges,其中edges[i]=[fromi,toi,weighti]表示在fromi和toi节点之间有一条带权无向边。最小生成树(MST)是给定图中边的一个子集,它连接了所有节点且没有环,而且这些边......
  • leetcode 刷题day43动态规划Part12(115.不同的子序列、583. 两个字符串的删除操作、72.
    115.不同的子序列思路:这个题还是比较有难度的,问题s中有多少个t子序列可以转化为s字符串中有多少删除元素的方式,使s可以变成t。考虑动规五部曲。1、确定dp数组(dptable)以及下标的含义dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。2、确定递推公式......
  • leetcode 刷题day42动态规划Part11(1143.最长公共子序列、1035.不相交的线、53. 最大子
    1143.最长公共子序列思路:718.最长重复子数组两个数组对应相同且连续,所以递推公式是dp[i-1][j-1]+1。最长公共子序列不要求连续但要求相对顺序,差别主要在于递推公式。对于该题主要有两大情况:text1[i-1]与text2[j-1]相同,text1[i-1]与text2[j-1]不相同。如果te......