IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Leetcode128. Longest Consecutive Sequence - 彻底掌握并查集(Union Find)系列题2 -> 正文阅读

[数据结构与算法]Leetcode128. Longest Consecutive Sequence - 彻底掌握并查集(Union Find)系列题2

Given an unsorted array of integers?nums, return?the length of the longest consecutive elements sequence.

You must write an algorithm that runs in?O(n)?time.

Example 1:

Input: nums = [100,4,200,1,3,2]
Output: 4
Explanation: The longest consecutive elements sequence is [1, 2, 3, 4]. Therefore its length is 4.

Example 2:

Input: nums = [0,3,7,2,5,8,4,6,0,1]
Output: 9

Constraints:

  • 0 <= nums.length <= 105
  • -109?<= nums[i] <= 109

这道题有很多解法,比如通过排序或者使用Hashmap。但是通过分析题目就会发现这题还可以使用并查集(Union Find)来解答。

我们知道并查集(Union Find)是解决连通性问题和处理集合的合并与查找问题。题目要求是从一个未排序的数组中查找一个最长的连续数的序列,其实就是合并连续的数,然后查找最长连续数序列,刚好满足并查集特性。

算法实现:

1)数组里的所有数看成一个单点集合,

2)然后根据数之间是否连续的连通特性,把所有连续数并成一个集合

3)最后最大那个集合就是我们要找的最长连续数序列。

class UnionFind:
    def __init__(self):
        self.parent = {}  #由于数值不连续大小不定可能很大所以这里用字典而不用数组
        self.size = {} #用于记录数所在集合的大小,提高合并查找的效率
        self.maxsize = 0 #用于记录最大集合里的数的个数
            
    #查找一个数的父节点
    def find(self, x):        
        if self.parent[x] != x:
            self.parent[x] = self.find(self.parent[x])
        return self.parent[x]
    
    def merge(self, x, y):
        px, py = self.find(x), self.find(y)
        if px == py:
            return
        
        if self.size[px] > self.size[py]:
            self.parent[py] = px
            self.size[px] += self.size[py]
            self.maxsize = max(self.maxsize, self.size[px])
        else:
            self.parent[px] = py
            self.size[py] += self.size[px]
            self.maxsize = max(self.maxsize, self.size[py])
        
class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:      
        uf = UnionFind()
        #输入数组为空返回长度为0否则长度至少为1
        uf.maxsize = 0 if len(nums) == 0 else 1
        
        for num in nums:
            #与到一个新数先作为一个单点集合存入,重复出现的数可不做处理
            if num not in uf.parent:
                uf.parent[num] = num
                uf.size[num] = 1
                
                #用当前数分别加1和减1去寻找是否已经存在,如果是则进行合并
                if num - 1 in uf.parent :
                    uf.merge(num, num - 1)
                if num + 1 in uf.parent:
                    uf.merge(num, num + 1)
        
        return uf.maxsize

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-27 10:09:32  更:2021-11-27 10:10:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 10:50:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码