LeetCode[685]冗余连接II

news2024/9/22 17:36:14

难度:困难

题目:

在本问题中,有根树指满足以下条件的 有向 图。该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。

输入一个有向图,该图由一个有着 n 个节点(节点值不重复,从 1 n )的树及一条附加的有向边构成。附加的边包含在 1 n 中的两个不同顶点间,这条附加的边不属于树中已存在的边。

结果图是一个以边组成的二维数组 edges 。 每个元素是一对 [ui, vi] ,用以表示 有向 图中连接顶点 ui 和顶点 vi 的边,其中 ui vi 的一个父节点。

返回一条能删除的边,使得剩下的图是有 n 个节点的有根树。若有多个答案,返回最后出现在给定二维数组的答案。

示例 1:

输入:edges = [[1,2],[1,3],[2,3]]

输出:[2,3]


示例 2:

输入:edges = [[1,2],[2,3],[3,4],[4,1],[1,5]]

输出:[4,1]


提示:

  • n == edges.length

  • 3 <= n <= 1000

  • edges[i].length == 2

  • 1 <= ui, vi <= n


Related Topics

  • 深度优先搜索

  • 广度优先搜索

  • 并查集


重点!!!解题思路

第一步:

明确解题手段
类似于此种连通性问题均能使用并查集来实现
但是这题我们需要将并查集稍微修改一下
已知此题要求每个节点的入度不能大于1
所以我们需要在并查集中添加一个记录每个几点入度的数组

第二步:

题中要求返回最后出现的答案,那么我就从后往前进行枚举
每次选中的不进行判断,
如果在这种情况下,其余节点全部连接成功并且没有连成一个环,并且每个节点的入度不>1
那么这次选中的数组则为多余值,
这个值即为答案

源码:

class UnionFind {
    //记录每个节点的根节点
    int[] parent;
    //记录每个子集的节点数
    int[] rank;
    //记录并查集中的联通分量数量
    int count;

    //每个节点的入度数量
    int[] vis;
    //是否有环
    boolean flag1;
    //是否入度大于1
    boolean flag2;

    public UnionFind(int n){
        count=n;
        parent=new int[n];
        for (int i=0;i<n;i++){
            parent[i]=i;
        }
        rank=new int[n];
        Arrays.fill(rank,1);
        flag1=false;
        flag2=false;
        vis=new int[n];
    }

    //路径压缩
    public int find(int ind){
        if (parent[ind]!=ind){
            parent[ind]=find(parent[ind]);
        }
        return parent[ind];
    }

    //按秩合并
    public void unite(int ind1,int ind2){
        int root1=find(ind1),root2=find(ind2);
        if (root1!=root2){
            if (rank[root1]<rank[root2]){
                int temp=root2;
                root2=root1;
                root1=temp;
            }
            parent[root2]=root1;
            rank[root1]+=rank[root2];
            count--;
        }else {//如果这两个节点的根节点相等了,说明这次判断成环了
            flag1=true;
        }
    }

    public int getCount(){
        return count;
    }
    public boolean connected(int ind1,int ind2){
        return find(ind1)==find(ind2);
    }
}
class Solution {
    public int[] findRedundantDirectedConnection(int[][] edges) {
        for (int i = edges.length-1; i >=0 ; i--) {
            int x=edges[i][0];
            int y=edges[i][1];
            UnionFind uf = new UnionFind(edges.length+1);
            for (int j=0;j<edges.length;j++){
                if (edges[j][0]==x&&edges[j][1]==y) continue;
                uf.unite(edges[j][0],edges[j][1]);
                if (uf.flag1) break;
                if (++uf.vis[edges[j][1]]>1){ //每次让下标为1的节点入度+1
                    uf.flag2=true;
                    break;
                }
            }
            if (!uf.flag1&& !uf.flag2){ //如果没成环,入度也是正常的,那么此次选中的待删除节点即为答案
                return new int[]{x,y};
            }
        }
        return null; //这里返回什么都可以,因为上面一定会返回一个值
    }
}

运行结果:

如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。

系列持续更新中,点个订阅吧

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

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

相关文章

Linux 笔记3

5.Linux 的网络信息5.1主机名称5.1.1临时修改&#xff1a;hostname 新名字 &#xff08;需要重新进入才能显示新名字&#xff09;reboot重启虚拟机5.1.2永久&#xff1a;vi /etc/hostname5.2DNS解析dns解析域名域名-》ipdns域名劫持&#xff1a;将域名对应的ip改掉5.2.1修改主机…

networkx学习(四)无标度网络

networkx学习(四)无标度网络 无标度网络: 对于随机网络和规则网络,度分布区间非常狭窄,大多数节点都集中在节点度均值< k >的附近,说明节点具有同质性,因此< k >可以被看作是节点度的一个特征标度。而在节点度服从幂律分布的网络中,大多数节点的度都很小,…

从零创建vue示例

从零创建vue搭建node环境创建vue项目vue项目目录介绍搭建node环境 1.下载node(node官网) 安装node一路点next即可 2.windowR—cmd ----测试一下npm -v 以及node -v 显示版本号 3.执行以下命令&#xff08;-g表示全局安装&#xff09; npm install -g vue npm install -g vue…

优化命令 nload详解

优化命令 nload详解 引言 nload用于实时监控linux下网络流量信息&#xff0c;是命令行工具&#xff0c;用来监控网络的吞吐量。它使用两个图表数据来对进出站流量进行可视化。 一、nload安装 nload工具并不是centos自带的&#xff0c;需要我们手动安装下载 直接yum安装查不到…

Kettle 快捷引入数据库

在编写kettle任务时往往需要连接数据库&#xff0c;kettle一共提供了四种数据库配置方式&#xff0c;JDBC、ODBC、OCI、JNDI&#xff0c;我最初直接使用的最为熟悉的JDBC&#xff0c;但是多写几个转换程序就会发现&#xff0c;每新建一个转换任务文件时都需要重新配置数据信息&…

DDOS渗透与攻防(四)之应用层DoS攻击

系列文章 DDOS渗透与攻防(一)之拒绝服务攻击概念介绍 DDOS渗透与攻防(二)之SYN-Flood攻击 DDOS渗透与攻防(三)之socktress攻击 应用层DoS攻击 攻击协议原理介绍说明-应用层DoS 应用服务漏洞 服务代码存在漏洞&#xff0c;遇异常提交数据时程序崩溃应用处理大量并发请求能力…

Git(见Docx)

Git的概念【1】Git技术&#xff1a;公司必备&#xff0c;一定要会 【2】Git概念&#xff1a; Git是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的项目。【3】什么是版本控制&#xff1f; 版本控制是一种记录一个或若干文件内容变化&#…

Redis 发布订阅模式的深度解析与实现消息队列

1 发布订阅模式(Pub/Sub)的概述我们可以利用Redis的List数据结构实现一个简单的消息队列&#xff0c;通过lpush命令写入消息&#xff0c;通过rpop 命令拉取消息&#xff0c;也可以使用BRPOP实现阻塞式的拉取消息。上面的消息队列有一个缺点&#xff0c;那就是不支持消息多播机制…

百趣代谢组学文献分享:以猪为模型检测哺乳动物之间的代谢物交换

百趣代谢组学文献分享&#xff0c;您对哺乳动物不同器官之间的代谢物交换情况了解吗&#xff1f; 本期百趣代谢组学小趣给大家分享的是美国普林斯顿大学Joshua D. Rabinowitz团队发表在Cell Metabolism上的研究成果。该团队以猪为模型&#xff0c;利用高通量靶标技术定量测定了…

QEMU/KVM带与不带音频驱动参数的实际区别

实际工作中用到QEMU/KVM&#xff0c;按照书中的命令启动虚拟机后&#xff0c;发现Ubuntu镜像启动后找不到声卡设备&#xff0c;经过一番搜索和尝试&#xff0c;最终发现是“-device ac97”这一关键选项所导致的。现将具体的对比结果记录如下&#xff1a; 不带“-device ac97”…

2023编程语言趋势

2023编程语言趋势 作为CTO&#xff0c;我需要持续关注编程语言的发展。按照惯例&#xff0c;每年年初我都会对未来一年关键编程语言的趋势做一定的预判。今年由于众所周知的原因&#xff0c;预测地有些晚&#xff0c;我选择在开年的第一天给出我的预测&#xff0c;也算是祝大家…

(Java高级教程)第四章必备前端基础知识-第三节2:JavaScript数组、函数和对象

文章目录一&#xff1a;数组二&#xff1a;函数三&#xff1a;对象一&#xff1a;数组 数组&#xff1a;JavaScript中的数组和Java中的ArrayList有点相似&#xff0c;可以动态扩容&#xff0c;并且由于它是动态类型的语言&#xff0c;所以数组内的元素类型不要求一定是相同的 …

【Git】安装搭建与相关概念

目录 1. 安装 1.1出现安全警告&#xff0c;点击运行 1.2浏览协议&#xff0c;下一步 1.3安装目录&#xff0c;所需要磁盘空间大小&#xff0c;下一步 1.4Git Bash需要安装的&#xff0c;其他默认即可&#xff0c;下一步 1.5开始菜单&#xff0c;下一步 1.6默认编辑器&…

《MySQL高级篇》十三、锁

文章目录1. 概述2. MySQL并发事务访问相同记录2.1 读-读情况2.2 写-写情况2.3 读-写或写-读情况2.4 并发问题的解决方案3. 锁的不同角度分类3.1从数据操作的类型划分:读锁、写锁1. 锁定读2. 写操作3.2 从数据操作的粒度划分:表级锁、页级锁、行锁1. 表锁(Table Lock)① 表级别的…

JavaScript 练手小技巧:打字小游戏

放假闲来无事&#xff0c;一群小屁孩想玩我的电脑。 字都不会打&#xff0c;还玩电脑。 用 js 写一个打字游戏&#xff0c;打不到 100 分&#xff0c;就不要玩我的电脑~~~&#xff01;&#xff01;&#xff01; 整体界面如下所示&#xff0c;一切从简~ HTML 结构 <div i…

正则表达式-学习笔记

正则表达式&#xff08;Regular Expression&#xff09;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff1a;a到z之间的字母&#xff09;和特殊字符&#xff08;称为“元字符”&#xff09;。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字…

企业如何利用生产制造业ERP管理系统做好采购管理?

采购对生产制造业企业而言&#xff0c;至关重要&#xff01;采购成本能够占到很多企业经营成本的60%左右&#xff0c;而所采购物料的质量直接决定了产品的质量。而在生产制造企业的采购工作中&#xff0c;经常会出现一些问题&#xff0c;比如&#xff1a;采购成本难控、采购流程…

Elasticsearch(五)--ES文档的操作(上)---写入文档

一、前言 使用ES构建搜索引擎时需要经常对文档进行操作&#xff0c;除了简单的单条文档操作&#xff0c;有时还需要进行批量操作。我们这章主要学习ES文档的增删改的操作&#xff0c;由于涉及到的代码量会比较多&#xff0c;所以分为3篇文章分别说明文档的这个三个操作。那么我…

星环科技TDH多模型统一架构VS CDH架构

CDH是Cloudera的开源平台发行版&#xff0c;通过将Hadoop与其他十几个开源项目集成&#xff0c;为企业大数据业务提供服务。 在CDH开源大数据方案中&#xff0c;是通过多个互相独立的组件提供相应的能力&#xff0c;每个场景需要一个组件独立交付&#xff0c;为了实现不同业务…

【SpringCloud】OpenFeign远程调用的基本使用

一、OpenFeign替代RestTemplateRestTemplate 存在的问题我们以前利用RestTemplate发起远程调用的代码public Order queryOrderById(Long orderId) {// 1.查询订单Order order orderMapper.findById(orderId);// 2.利用restTemplate发起http请求// 为了负载均衡使用服务名称Str…