[LeetCode] 128、最长连续序列

题目描述

给定一个未排序的整数数组,找出最长连续序列的长度。

要求算法的时间复杂度为 O(n)。

示例:

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

解题思路

暴力,哈希表,并查集都可以。

并查集很好的博客。因为规定了时间复杂度,先排序不满足要求。注:本题的标签之前没有哈希表,但是用哈希表unordered_set)可满足要求,用并查集稍复杂。

  • 哈希表:这些数字用一个 HashSet 保存(或者用 Python 里的 Set),实现 O(1)时间的查询,同时,我们只对“当前数字 - 1 ”不在哈希表里的数字作为连续序列的第一个数字去找对应的最长序列,这是因为其他数字一定已经出现在了某个序列里了。(代码一看便懂)
  • 并查集:参考1参考2

参考代码

// 用哈希表
class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        int length = nums.size();
        if(length == 0)
            return 0;
        
        unordered_set<int> mSet(nums.begin(), nums.end());
        int maxLength = 0;
        for(auto num: mSet){
            int temp = num;
            if(mSet.count(temp-1) == 0){  // 这里保证了整体时间复杂度为O(n),其实撑死就O(2n)
                int tempLength = 1;
                while(mSet.count(temp+1) != 0){
                    tempLength++;
                    temp++;
                }
                
                maxLength = max(maxLength, tempLength);
            }
        }
        
        return maxLength;
    }
};
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是最连续序列的问题描述和解决思路: 【问题描述】 给定一个整数序列,找出其中最连续序列(至少包含2个元素),使得所有子序列元素之和相等,并返回该子序列度。 【解决思路】 这是一道典型的动态规划问题,我们可以用动态规划来解决。 我们可以先计算出整个序列的元素之和sum,然后设dp[i]表示以第i个元素结尾的最连续序列度。如果前i个元素的元素之和为sum,则前i个元素的最连续序列度为i,因为前i个元素中任意一个度为i的子序列的元素之和都等于sum。如果前i个元素的元素之和不为sum,则可以在前i-1个元素中找到一个最连续序列,使得该子序列的元素之和等于sum - nums[i],然后将第i个元素加入该子序列中,得到以第i个元素结尾的最连续序列。 因此,状态转移方程为: ``` dp[i] = i if sum(nums[:i+1]) == sum max(dp[j]+i-j if sum(nums[j:i+1]) == sum - nums[i] else 0 for j in range(i)) ``` 其中,sum(nums[:i+1])表示前i+1个元素的元素之和,sum - nums[i]表示前i个元素中除去第i个元素的元素之和。 最终,最连续序列度等于dp中的最大值。 【Python代码实现】 下面是一个简单的Python函数,用于计算最连续序列度: ```python def longest_continuous_subsequence(nums): """ 计算最连续序列度 """ if not nums: return 0 sum = 0 for num in nums: sum += num dp = [0] * len(nums) for i in range(len(nums)): if sum(nums[:i+1]) == sum: dp[i] = i else: dp[i] = max(dp[j]+i-j if sum(nums[j:i+1]) == sum - nums[i] else 0 for j in range(i)) return max(dp) ``` 注意,这里使用了Python内置的sum函数,用于计算序列中所有元素的和。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值