128. 最长连续序列

https://leetcode-cn.com/problems/longest-consecutive-sequence/

解法一:

用哈希表存储每个端点值对应连续区间的长度

若数已在哈希表中:跳过不做处理

若是新数加入: 取出其左右相邻数已有的连续区间长度 left 和 right

计算当前数的区间长度为:cur_length = left + right + 1

根据 cur_length 更新最大长度 max_length 的值

更新区间两端点的长度值

class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        hash_dict = {}
        max_len = 0
        
        for num in nums:
            if num not in hash_dict:
                left = hash_dict.get(num-1, 0)  #左边区间长度,不存在则为0
                right = hash_dict.get(num+1, 0)  #右边区间长度,不存在则为0
                
                cur_len = left + right + 1
                max_len = max(max_len, cur_len)
                
                #更新区间两端点
                hash_dict[num] = cur_len   #注意
                hash_dict[num - left] = cur_len
                hash_dict[num + right] = cur_len
                #print(hash_dict, num, left, right)
        return max_len

二、并查集

“连续”可以理解为num与num+1的连通关系,巧妙转化为并查集问题

对每个数num,检查num+1是否存在,若存在将他们连通。

并查集的规模为n,每个节点为num的下标i(其实节点值取什么无所谓,主要是为了合并,只要不重合即可,取num也可,但num的范围太大且不一定连续,所以取i较合适)

将每个数存入map,key为num,值为i。然后遍历map。(为何不是遍历nums?因为nums可能有重复数字)

最后更新于