No.230 - LeetCode[128] Longest Consecutive Sequence - 数组中连续数字O(N)

本文深入探讨了LeetCode第128题“最长连续序列”的解题思路与算法实现,对比了两种不同的C++代码解决方案,详细分析了使用unordered_map进行优化的方法,以及如何避免在算法设计中常见的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

unordered_map 也算O(1), ^ _ ^!
不能用mp值定义为坐标,因为会有0值的存在

WA代码

/*
 * @lc app=leetcode id=128 lang=cpp
 *
 * [128] Longest Consecutive Sequence
 */

// @lc code=start
class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        unordered_map<int,int> mpL,mpR;
        int N = nums.size();
        int ans = 0;
        int L,R;
        for(int i=0;i<N;i++){
            L = mpL[nums[i]-1];
            R = mpR[nums[i]+1];
            if(L!=0 && R!=0){
                mpL[R] = L;
                mpR[L] = R;
                ans = max(ans,R-L+1);
            }else if(L!=0){
                mpL[nums[i]] = L;
                mpR[nums[i]] = nums[i];
                ans = max(ans,nums[i]-L+1);
            }else if(R!=0){
                mpR[nums[i]] = R;
                mpL[nums[i]] = nums[i];
                ans = max(ans,R-nums[i]+1);
            }else{
                mpL[nums[i]] = mpR[nums[i]] = nums[i];
                ans = max(ans,1);
            }
        }
        return ans;
    }
};
// @lc code=end

AC代码:

/*
 * @lc app=leetcode id=128 lang=cpp
 *
 * [128] Longest Consecutive Sequence
 */

// @lc code=start
class Solution {
public:
    // 因为存在0值
    // 所以map中值不能定义为坐标
    // 定义为长度比较合理
    int longestConsecutive(vector<int>& nums) {
        unordered_map<int,int> mpL,mpR;
        int N = nums.size();
        int ans = 0;
        int L,R;
        for(int i=0;i<N;i++){
            // 已经处理过的值不再处理,因为不能保证边界中间节点值是合法的。
            if(mpL[nums[i]] != 0 || mpR[nums[i]] != 0) continue;
            L = mpL[nums[i]-1];
            R = mpR[nums[i]+1];
            // 更新当前节点,防止下次读入,不然会WA
            mpL[nums[i]] = L+1;
            mpR[nums[i]] = R+1;
            // 更新边界
            mpL[nums[i]+R] = mpR[nums[i]-L] = R+L+1;
            ans = max(ans,L+R+1);
        }
        return ans;
    }
};
// @lc code=end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值