LeetCode热题100-第3题

题目:128. 最长连续序列 - 力扣(LeetCode)

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。

示例 2:

输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9

提示:

  • 0<= nums.length <= 10^{5}
  • -10^{​{9}}<= nums[i]<= 10^{9}

分析:本题的连续序列是唯一的,为避免重复遍历,可以先找到每个连续序列的第一个值,随后利用集合依次找寻后面是否还有值,并实时记录当前序列的长度,在遍历完整个连续序列后,更新答案即可。

C++利用set进行遍历存储,代码如下:

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        // 初始化结果大小为0,用于记录最长的连续序列长度
        int resultSize = 0;
        
        // 创建一个集合,用于存储数组中的所有数字,集合会自动去重
        set<int> num_set;
        
        // 使用数组的迭代器范围将所有元素插入到集合中
        num_set.insert(nums.begin(), nums.end());
        
        // 遍历集合中的每个数字
        for (auto num : num_set) {
            // 如果当前数字的前一个数字不在集合中,说明当前数字是一个新的序列的开始
            if (num_set.find(num - 1) == num_set.end()) {
                // 将当前数字赋值给currentNum,用于后续的序列长度计算
                int currentNum = num;
                // 初始化当前序列长度为1,因为至少包含当前数字
                int currentSize = 1;
                
                // 当当前数字的后一个数字在集合中时,继续向后寻找,直到找到一个不存在的数字
                while (num_set.find(currentNum + 1) != num_set.end()) {
                    // 移动到下一个数字
                    currentNum++;
                    // 当前序列长度加1
                    currentSize++;
                }
                
                // 更新结果大小,取当前序列长度和已有结果大小的较大值
                resultSize = max(resultSize, currentSize);
            }
        }
        
        // 返回最终计算出的最长连续序列的长度
        return resultSize;
    }
};

 python代码实现如下:

class Solution(object):
    def longestConsecutive(self, nums):
        # 如果输入的数组为空,直接返回0,因为没有元素可以形成序列
        if not nums:
            return 0
        
        # 初始化结果大小为0,用于记录最长的连续序列长度
        resultSize = 0
        
        # 将数组转换为集合,以便快速判断一个数是否在数组中
        num_set = set(nums)
        
        # 遍历集合中的每个数字
        for num in num_set:
            # 如果当前数字的前一个数字不在集合中,说明当前数字是一个新的序列的开始
            if num - 1 not in num_set:
                # 将当前数字赋值给current_num,用于后续的序列长度计算
                current_num = num
                # 初始化当前序列长度为1,因为至少包含当前数字
                current_size = 1
                
                # 当当前数字的后一个数字在集合中时,继续向后寻找,直到找到一个不存在的数字
                while current_num + 1 in num_set:
                    # 移动到下一个数字
                    current_num = current_num + 1
                    # 当前序列长度加1
                    current_size = current_size + 1
                
                # 更新结果大小,取当前序列长度和已有结果大小的较大值
                resultSize = max(current_size, resultSize)
        
        # 返回最终计算出的最长连续序列的长度
        return resultSize

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值