当前位置:网站首页>leetcode-每日一题565. 数组嵌套(标记图和并查集)
leetcode-每日一题565. 数组嵌套(标记图和并查集)
2022-07-31 05:10:00 【lin钟一】

题目链接:https://leetcode.cn/problems/array-nesting/
思路
方法一、并查集
直接想法
这题告诉我们数组内的数字是0-N-1,且不会重复,我们可以把A[i] , A[A[i]]…看成一个环,数组可以被分成多个环,我们只需计算多个环中的最大长度即可
判断环这里我们用的并查集,把每个元素看成一棵树,将同一个环的A[i] 和A[A[i]]两棵树合并,怎么判断他是同一个环呢?我们只需要去递归走下去,走到他的根节点,判断他们的根节点是否相同即可
算法
- 初始化f数组和size数组,f数组记录当前结点的根节点,初始化都是以自己为根节点,size数组记录每个树的大小
- find函数用来找当前nums[i]的根节点
- merge函数用来合并同一环的子树,如果我们同根了表示已经合并过了则直接退出
- 循环遍历nums数组,合并nums[i]和nums[nums[i]]两棵树
代码示例
func arrayNesting(nums []int) int {
f := make([]int, len(nums))
size := make([]int, len(nums))
for i := range f{
f[i] = i
size[i] = 1
}
ans := 1
var find func(x int) int
find = func(x int) int{
if x == f[x]{
return x
}
return find(f[x])
}
merge := func(x, y int){
a := find(x)
b := find(y)
if a == b{
return
}
f[b] = f[a]
size[a] += size[b]
if ans < size[a]{
ans = size[a]
}
}
for i := range nums{
merge(nums[i], nums[nums[i]])
}
return ans
}

复杂度分析
- 时间复杂度:O(n) 其中n表示nums数组的长度,遍历一次nums数组需要O(n)的时间
- 空间复杂度:O(2 * n) 其中n表示nums数组的长度,需要申请f数组和size数组的空间
方法二、标记图
直接想法
遍历数组,从 i 向 nums[i] 连边,我们可以得到一张有向图。
由于题目保证nums 中不含有重复的元素,因此有向图中每个点的出度和入度均为 1。
在这种情况下,有向图必然由一个或多个环组成。我们可以遍历 nums,找到节点个数最大的环。
利用nums 中的元素大小在 [0, n-1] 之间这一条件,我们可以省略 vis 数组,改为标记 nums[i]=n,来实现和 vis 数组同样的功能。
代码示例
func arrayNesting(nums []int) (ans int) {
n := len(nums)
for i := range nums {
cnt := 0
for nums[i] < n {
i, nums[i] = nums[i], n
cnt++
}
if cnt > ans {
ans = cnt
}
}
return
}

复杂度分析
时间复杂度:O(n),其中 nn 是数组 nums 的长度。
空间复杂度:O(1),我们只需要常数的空间保存若干变量。
边栏推荐
猜你喜欢

docker安装postgresSQL和设置自定义数据目录

Anaconda配置环境指令

12 【nextTick 过渡与动画】

一文了解大厂的DDD领域驱动设计

目标检测学习笔记

分布式事务——分布式事务简介、分布式事务框架 Seata(AT模式、Tcc模式、Tcc Vs AT)、分布式事务—MQ

Interview Redis High Reliability | Master-Slave Mode, Sentinel Mode, Cluster Cluster Mode

Refinement of the four major collection frameworks: Summary of List core knowledge

MySQL8.0.26安装配置教程(windows 64位)

【MySQL8入门到精通】基础篇- Linux系统静默安装MySQL,跨版本升级
随机推荐
数据库上机实验3 连接查询和分组查询
剑指offer基础版 ----- 第28天
实验8 DNS解析
2022-07-30:以下go语言代码输出什么?A:[]byte{} []byte;B:[]byte{} []uint8;C:[]uint8{} []byte;D:[]uin8{} []uint8。
torch.normal函数用法
Swordsman Offer Special Assault Edition ---- Day 6
MySQL (updating)
wpf ScrowViewer水平滚动
Flink sink redis 写入Redis
Redis 事务学习有感
踏上编程之路,你必须要干的几件事
对list集合进行分页,并将数据显示在页面中
Flask-based three-party login process
剑指offer基础版 ---- 第27天
如何将项目部署到服务器上(全套教程)
[MQ I can speak for an hour]
变量的解构赋值
基于flask的三方登陆的流程
Element concatenation operations in numpy and pytorch: stack, concatenat, cat
有了MVC,为什么还要DDD?