【LeetCode每日一题】——802.找到最终的安全状态

文章目录

  • 一【题目类别】
  • 二【题目难度】
  • 三【题目编号】
  • 四【题目描述】
  • 五【题目示例】
  • 六【题目提示】
  • 七【解题思路】
  • 八【时空频度】
  • 九【代码实现】
  • 十【提交结果】

一【题目类别】

二【题目难度】

  • 中等

三【题目编号】

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

四【题目描述】

  • 有一个有 n 个节点的有向图,节点按 0n - 1 编号。图由一个 索引从 0 开始 的 2D 整数数组 graph表示, graph[i]是与节点 i 相邻的节点的整数数组,这意味着从节点 igraph[i]中的每个节点都有一条边。
  • 如果一个节点没有连出的有向边,则该节点是 终端节点 。如果从该节点开始的所有可能路径都通向 终端节点 ,则该节点为 安全节点
  • 返回一个由图中所有 安全节点 组成的数组作为答案。答案数组中的元素应当按 升序 排列。

五【题目示例】

  • 示例 1
    在这里插入图片描述

    • 输入:graph = [[1,2],[2,3],[5],[0],[5],[],[]]
    • 输出:[2,4,5,6]
    • 解释:示意图如上。
      • 节点 5 和节点 6 是终端节点,因为它们都没有出边。
      • 从节点 2、4、5 和 6 开始的所有路径都指向节点 5 或 6 。
  • 示例 2

    • 输入:graph = [[1,2,3,4],[1,2],[3,4],[0,4],[]]
    • 输出:[4]
    • 解释:
      • 只有节点 4 是终端节点,从节点 4 开始的所有路径都通向节点 4 。

六【题目提示】

  • n = = g r a p h . l e n g t h n == graph.length n==graph.length
  • 1 < = n < = 1 0 4 1 <= n <= 10^4 1<=n<=104
  • 0 < = g r a p h [ i ] . l e n g t h < = n 0 <= graph[i].length <= n 0<=graph[i].length<=n
  • 0 < = g r a p h [ i ] [ j ] < = n − 1 0 <= graph[i][j] <= n - 1 0<=graph[i][j]<=n1
  • g r a p h [ i ] graph[i] graph[i] 按严格递增顺序排列。
  • 图中可能包含自环。
  • 图中边的数目在范围 [ 1 , 4 ∗ 1 0 4 ] [1, 4 * 10^4] [1,4104] 内。

七【解题思路】

  • 利用拓扑排序的思想解决该问题
  • 我们首先构建一个反向图,即假如之前i -> j,那么反向图就变为j -> i,反向图的目的是用来后续计算出度来找到终端节点
  • 同时构建原图的出度数组,后续就会用该数组来找到安全节点
  • 然后将得到的所有终端节点都入队列,后续操作该队列即可得到所有终端节点
  • 然后将得到的安全节点(所有终端节点都是安全节点)保存到集合中
  • 然后通过逆向拓扑排序计算得到安全节点:
    • 首先从队列中取出一个安全节点
    • 然后查看它的邻接节点
      • 然后将邻接节点的出度减1
      • 如果此时出度为0,那么说明其为安全节点,将其入队列和集合中
  • 具体细节可以参考下面的代码
  • 最后返回结果即可

八【时空频度】

  • 时间复杂度: O ( m + n ) O(m + n) O(m+n) m m m为图的节点数, n n n为图的边数
  • 空间复杂度: O ( m + n ) O(m + n) O(m+n) m m m为图的节点数, n n n为图的边数

九【代码实现】

  1. Java语言版
class Solution {public List<Integer> eventualSafeNodes(int[][] graph) {// 图中节点的个数int n = graph.length;// 用来存储反向图List<List<Integer>> reverseGraph = new ArrayList<>();for (int i = 0; i < n; i++) {reverseGraph.add(new ArrayList<>());}// 每个节点的出度int[] outDegree = new int[n];// 构建反向图和出度数组for (int i = 0; i < n; i++) {outDegree[i] = graph[i].length;for (int neighbor : graph[i]) {reverseGraph.get(neighbor).add(i);}}// 初始化队列,将所有终端节点(出度为0的节点)加入队列Queue<Integer> queue = new LinkedList<>();for (int i = 0; i < n; i++) {if (outDegree[i] == 0) {queue.offer(i);}}// 用集合存储安全节点Set<Integer> safeNodes = new HashSet<>(queue);// 逆向拓扑排序while (!queue.isEmpty()) {int node = queue.poll();for (int neighbor : reverseGraph.get(node)) {outDegree[neighbor]--;if (outDegree[neighbor] == 0) {safeNodes.add(neighbor);queue.offer(neighbor);}}}// 返回安全节点的升序列表List<Integer> res = new ArrayList<>(safeNodes);Collections.sort(res);return res;}
}
  1. Python语言版
class Solution:def eventualSafeNodes(self, graph: List[List[int]]) -> List[int]:# 图中节点的个数n = len(graph)# 用来存储反向图reverse_graph = defaultdict(list)# 每个节点的出度out_degree = [0] * n# 构建反向图和出度数组for i, neighboors in enumerate(graph):out_degree[i] = len(neighboors)for neighboor in neighboors:reverse_graph[neighboor].append(i)# 初始化队列,将所有终端节点(出度为0的节点)加入队列queue = deque(i for i in range(n) if out_degree[i] == 0)# 用集合存储安全节点safe_nodes = set(queue)# 逆向拓扑排序while queue:node = queue.popleft()for neighboor in reverse_graph[node]:out_degree[neighboor] -= 1if out_degree[neighboor] == 0:safe_nodes.add(neighboor)queue.append(neighboor)# 返回安全节点的升序列表return sorted(safe_nodes)
  1. C++语言版
class Solution {
public:vector<int> eventualSafeNodes(vector<vector<int>>& graph) {// 图中节点的个数int n = graph.size();// 用来存储反向图vector<vector<int>> reverseGraph(n);// 每个节点的出度vector<int> outDegree(n, 0);// 构建反向图和出度数组for (int i = 0; i < n; i++) {outDegree[i] = graph[i].size();for (int neighbor : graph[i]) {reverseGraph[neighbor].push_back(i);}}// 初始化队列,将所有终端节点(出度为0的节点)加入队列queue<int> q;// 用集合存储安全节点unordered_set<int> safeNodes;for (int i = 0; i < n; i++) {if (outDegree[i] == 0) {q.push(i);safeNodes.insert(i);}}// 逆向拓扑排序while (!q.empty()) {int node = q.front();q.pop();for (int neighbor : reverseGraph[node]) {outDegree[neighbor]--;if (outDegree[neighbor] == 0) {safeNodes.insert(neighbor);q.push(neighbor);}}}// 返回安全节点的升序列表vector<int> res(safeNodes.begin(), safeNodes.end());sort(res.begin(), res.end());return res;}
};

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. Python语言版
    在这里插入图片描述

  3. C++语言版
    在这里插入图片描述

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

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

相关文章

安利一款开源企业级的报表系统SpringReport

SpringReport是一款企业级的报表系统&#xff0c;支持在线设计报表&#xff0c;并绑定动态数据源&#xff0c;无需写代码即可快速生成想要的报表&#xff0c;可以支持excel报表和word报表两种格式&#xff0c;同时还可以支持excel多人协同编辑&#xff0c;后续考虑实现大屏设计…

考公人数攀升?地信、测绘、地质、遥感等专业,能报考哪些单位

近年来&#xff0c;考公人数持续飙升&#xff0c;国考报名人数更逐年攀升。2025年国家公务员考试共有341.6万人通过资格审查&#xff0c;报录比达86:1。国考报名人数再创新高。 国家公务员考试时间安排 地理学相关岗位分析 地信属于地理科学类&#xff0c;测绘类中不包括地信&…

LabVIEW 离心泵机组故障诊断系统

开发了一套基于LabVIEW图形化编程语言设计的离心泵机组故障诊断系统。系统利用先进的数据采集技术和故障诊断方法&#xff0c;通过远程在线监测与分析&#xff0c;有效提升了离心泵的预测性维护能力&#xff0c;保证了石油化工生产的连续性和安全性。 项目背景及意义 离心泵作…

YOLOv10改进策略【卷积层】| CVPR-2023 SCConv 空间和通道重建卷积:即插即用,减少冗余计算并提升特征学习

一、本文介绍 本文记录的是利用ScConv优化YOLOv10的目标检测网络模型。深度神经网络中存在大量冗余&#xff0c;不仅在密集模型参数中&#xff0c;而且在特征图的空间和通道维度中。ScConv模块通过联合减少卷积层中空间和通道的冗余&#xff0c;有效地限制了特征冗余&#xff…

Linux 文件系统权限

文件的一般权限 文件详细信息 使用命令 ll 或 ls -l 查看 文件权限构成 权限针对三类对象定义 owner &#xff1a;所有者&#xff0c;缩写 u group &#xff1a;所属组&#xff0c;缩写 g other &#xff1a;其他人&#xff0c;缩写 o 访问者三种权限 组成模式分析 …

C++上机实验|多态性编程练习

1.实验目的 (1)理解多态性的概念。 (2)掌握如何用虚函数实现动态联编 (3)掌握如何利用虚基类。 2.实验内容 设计一个飞机类 plane,由它派生出歼击机类fighter和轰炸机类 bomber,歼击机类fighter 和轰炸机类bomber 又共同派生出歼轰机(多用途战斗机)。利用虚函数和虚基类描述…

学习threejs,使用对象组合

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.Object3D 三维物体 二…

遇到的问题

刚遇到的问题&#xff1a; 一直以为这个图片数据结构是以下这种&#xff1a; {"descrlong1": [{"CL04": "人力违纪"},{"CL05": "其他"}], }其实数据结构是&#xff1a; {"descrlong1": [{"key": &quo…

发现8个高风险漏洞 NVIDIA GeForce用户必须更新GPU驱动程序

所有NVIDIA GeForce图形处理器都面临着高风险&#xff0c;因为该公司在其图形处理器驱动程序中发现了几个漏洞&#xff0c;这些漏洞可能会让黑客利用你的系统。公司敦促用户更新到最新的GeForce显示屏和VGPU驱动程序&#xff0c;以确保他们的系统不受任何漏洞的影响。 NVIDIA在…

Redis 中 Bitmap 原理和应用

Bitmap Redis中的Bitmap&#xff08;位图&#xff09;是一种较为特殊数据类型&#xff0c;它以最小单位bit来存储数据&#xff0c;我们知道一个字节由 8个 bit 组成&#xff0c;和传统数据结构用字节存储相比&#xff0c;这使得它在处理大量二值状态&#xff08;true、false 或…

微信小程序开发,诗词鉴赏app

文章目录 1. 项目功能思维导图2. 项目涉及到的技术点3. 开发环境4. 项目运行效果5. 部分功能实现6. 关于本人其它项目的介绍 1. 项目功能思维导图 2. 项目涉及到的技术点 使用MySQL数据库实现数据存储使用setInterval实现启动页3s倒计时使用storage实现数据持久化存储&#xf…

什么是阿里云上的主机安全服务?

在数字化时代&#xff0c;数据安全和网络安全成为了企业最关心的问题之一。随着越来越多的企业将业务迁移至云端&#xff0c;如何确保云环境的安全性&#xff0c;成为了企业必须面对的重要挑战。阿里云安全中心&#xff08;SAS&#xff09;作为一款全面的云安全解决方案&#x…

在K8s平台部署个人博客

在K8s平台部署个人博客 实验步骤查看wordpress前端的service配置word press 实验步骤 kubectl create secret generic mysql-pass --from-literalpasswordYOUR_PASSWORD把mysql.tar.gz和wordpress.tar.gz上传到K8s工作节点&#xff0c;手动解压即可&#xff1a; 通过网盘分享的…

【原创】java+ssm+mysql收纳培训网系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

Java | Leetcode Java题解之第523题连续的子数组和

题目&#xff1a; 题解&#xff1a; class Solution {public boolean checkSubarraySum(int[] nums, int k) {int m nums.length;if (m < 2) {return false;}Map<Integer, Integer> map new HashMap<Integer, Integer>();map.put(0, -1);int remainder 0;fo…

【时间之外】IT人求职和创业应知【27】

目录 新闻一物理智能公司完成4亿美元融资 新闻二A股IPO和再融资受理、审核回暖 新闻三AI流量变现财富峰会举办 认知和思考决定了你的赚钱能力。以下是今天可能引起你思考的热点新闻&#xff1a; 今日关键字&#xff1a;没吃过猪肉&#xff0c;还没见过猪跑吗&#xff1f; 新…

【前端开发入门】JavaScript快速入门--函数技巧

目录 引言一、函数基本注意事项1. 函数定义2. 默认参数3. 函数返回值及闭包3.1 举个函数返回值的简单例子3.2 当我需要利用函数内部变量做一些运算时&#xff0c;就需要使用js的闭包 二、函数注释1. 单行注释2. 多行注释3. 进阶玩法 三、总结 引言 本系列教程旨在帮助一些零基础…

权威认证!蓝卓获评IDC数字工厂领导者

日前&#xff0c;全球领先的IT市场研究和咨询公司IDC公布了《IDC MarketScape: 中国数字工厂整体解决方案厂商评估&#xff0c;2024》。其中&#xff0c;蓝卓成功入选IDC中国数字工厂整体解决方案厂商&#xff0c;位列领导者象限。 数字工厂整体解决方案领导者 《IDC MarketSc…

$tab的所有用法以及vue关闭页面的方法汇总

1、最简单粗暴的就是直接window.close(); 2.可以设置一个窗口的显示隐藏变量&#xff0c;比如点击新增按钮时&#xff0c;新增页面窗口就进行显示&#xff0c;点击关闭就把这个值置为flase 在最外层绑定open 初始值设为false 点击新增和修改按钮时&#xff0c;把状态置为true即…

全同态加密基于多项式环计算的图解

全同态加密方案提供了一种惊人的能力 —— 能够在不知道数据具体内容的情况下对数据进行计算。这使得你可以在保持潜在敏感源数据私密的同时&#xff0c;得出问题的答案。 这篇文章的整体结构包括多项式环相关的数学介绍&#xff0c;基于多项式环的加密和解密是如何工作的&…