LeetCode 128. 最长连续序列

本文介绍了两种方法解决寻找给定数组中最长连续序列的问题,分别是朴素遍历法和利用字典记录连续区间长度的方法,详细展示了两种解法的思路和代码实现。
摘要由CSDN通过智能技术生成

在这里插入图片描述
下面简单记录一下两种解法的思路:

  • 解法一
    想法很朴素,遍历数组中每一个数,比如x;
    然后,检查x+1,x+2等是否在给定数组中,直到x+y(从x开始的连续序列的终点),那么它的临时长度是y+1;
    对数组中每一个元素的临时长度取最大,得到最终答案。
class Solution:
# 解法一
    def longestConsecutive(self, nums: List[int]) -> int:
        res=0
        nums_set=set(nums)
        for num in nums_set:
            if num-1 not in nums_set:
                cur_num=num
                cur_len=1
                
                while cur_num+1 in nums_set:
                    cur_len+=1
                    cur_num+=1
                
                res=max(res,cur_len)
        return res
  • 解法二
    我觉得这个解法不容易想到。
    定义变量res,用于记录答案;
    首先,建立一个字典dics,字典中的键值对分为有效和无效两种情况,有效的键值对<key,value>表示以key这个值为端点的连续序列的长度为value,无效的键值对是算法进行过程中的副产品,并无实际意义;
    然后,遍历数组,对每一个数num,初始化dics[num]=1,表示暂时设置num所在区间的长度为1;
    接着,根据字典dics找到num-1所在连续区间的长度(如果num-1还没有被记录在字典dics中,那么返回0),记为left;根据字典dics找到num+1所在连续区间的长度(如果num+1还没有被记录在字典dics中,那么返回0),记为right;
    于是,得到数num目前所在连续区间的长度cur_len=left+1+right;
    然后,更新答案res=max(res,cur_len);更新数num目前所在连续区间的长度(注意:只对该连续区间的左右端点更新)dics[num-left]=cur_len,dics[num_right]=cur_len。
class Solution:
  # 解法2
    def longestConsecutive(self, nums: List[int]) -> int:
        res=0
        dics={}
        for num in nums:
            if num not in dics:
                left=dics.get(num-1,0)
                right=dics.get(num+1,0)
                dics[num]=1
                length=left+1+right
                res=max(res,length)
                dics[num-left]=length
                dics[num+right]=length
        return res
  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值