当前位置: 首页 > article >正文

【LeetCode】每日一题 2024_10_27 冗余连接(并查集)

前言

每天和你一起刷 LeetCode 每日一题~

今年过去 300 天了呀

LeetCode 启动!

题目:冗余连接

代码与解题思路

题目翻译:找到一条边删除之后,所有节点依旧是连通的

看到连通块,就不由自主的先把并查集的思路套进去,看看能不能实现

核心思路:

用并查集将边一个个链接起来,当有边和连通块重复链接的时候,就证明这条边是可以删除的,将其删除即可,代码如下:

func findRedundantConnection(edges [][]int) []int {
    n := len(edges)
    p := make([]int, n+1)
    for i := 1; i <= n; i++ {
        p[i] = i
    }
    // 并查集模版
    var find func(int) int 
    find = func(x int) int {
        if p[x] != x {
            p[x] = find(p[x])
        }
        return p[x]
    }
    for i := 0; ; i++ {
        // 如果联通两次,证明这条边可以删除,返回即可
        if find(edges[i][0]) == find(edges[i][1]) {
            return edges[i]
        }
        // 链接这两条边
        p[find(edges[i][0])] = find(edges[i][1])
    }
}

如果不了解并查集,推荐阅读:我之前写的并查集模版介绍

这里讲一讲并查集几个核心的操作:

1、并查集模版

find 操作:求 x 集合的编号(也就是求 x 的祖先节点)

var find func(int) int 
find = func(x int) int {
    if p[x] != x {
        p[x] = find(p[x])
    }
    return p[x]
}

2、p 数组初始化

在使用 p 数组前,需要进行的初始化,将节点存入 p 数组中(节点编号从 1 开始)

p := make([]int, n+1)
for i := 1; i <= n; i++ {
    p[i] = i
}

3、合并联通块

p[find(edges[i][0])] = find(edges[i][1])

理解这三个操作,并查集就能使用的得心应手啦~

每天进步一点点,我们明天不见不散~

可以和我刷一辈子的每日一题吗?
一题一题,积累起来就是一辈子。


http://www.kler.cn/news/367840.html

相关文章:

  • Java中的Java EE是什么?它有哪些应用场景和优势?
  • 多元线性回归【正规方程/sklearn】
  • LeetCode9:回文数
  • 从蚂蚁金服面试题窥探STW机制
  • 有望第一次走出慢牛
  • 【2024|滑坡数据集论文解读3】CAS滑坡数据集:用于深度学习滑坡检测的大规模多传感器数据集
  • JavaWeb的小结08
  • 前端聊天室页面开发(赛博朋克科技风,内含源码)
  • Axure随机验证码高级交互
  • 血量更新逻辑的实现
  • Windows AD 域的深度解析 第一篇:AD 域原理与多系统联动
  • 考研要求掌握的C语言程度(堆排序)1
  • HBase2.4.17 修改znode后master初始化失败
  • Flutter中使用Cookies
  • 动态库和静态库
  • 第五十三章 安全元素的详细信息 - Signature 详情
  • MySQL8.0.40编译安装
  • Ajax:请求 响应
  • HarmonyOS ArkTS与C++数据类型转换
  • 【前端】实操tips集合
  • 猫头虎 分享:MySQL 中 TEXT 与 LONGTEXT 数据类型详解与使用场景分析
  • ORACLE 11G WINDOWS上面搭建DG,路径对应不起作用
  • Matlab学习03-符号的替换及运算(接上一篇)
  • Python记录-字典
  • 深入解析 MySQL 数据库:防止脏读
  • 获取 Excel 文件中的所有工作表名称,可以通过 OleDbConnection 获取表架构