首页 > 其他分享 >128. 最长连续序列

128. 最长连续序列

时间:2023-07-19 20:33:39浏览次数:30  
标签:right cur nums int 序列 mp ans 128 最长

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

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


示例 1:

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

> 方法一:双指针


class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        unique(nums.begin(),nums.end());
        int left,right;
        left = 0;
        right = 1;
        int len = nums.size();
        if(len <= 1) return len;
        int res = 1;
        int l = 1;
        while(left < len && right < len){
            if(nums[right - 1] + 1 == nums[right]){
                right++;
            }
            else{
                res = max(res,right - left);
                left = right;
                right++; 
            }
        }
        res = max(res,right - left);
        return res;
    }
};

> 方法二:哈希集合


class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        unordered_set<int> st;
        for(const auto&p:nums){
            st.insert(p);
        }
        int ans = 0;
        for(const auto&p:nums){
            int cur = p;
            if(!st.count(cur-1)){
                while(st.count(cur+1)){
                    cur++;
                }
            }
            ans = max(ans,cur-p+1);
        }
        return ans;
    }
};

> 方法三:哈希表


class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        unordered_map<int,int> mp;
        for(const auto&p:nums){
            mp[p] = p;
        }
        int ans = 0;
        for(const auto&p:nums){
            if(!mp.count(p-1)){
                int right = mp[p];
                while(mp.count(right+1)){
                    right = mp[right + 1];
                }
                ans = max(ans,right-p+1);
            }
        }
        return ans;
    }
};

> 方法四:哈希表记录连续区间长度(动态规划)


class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        unordered_map<int,int> mp;
        int ans = 0;
        for(const auto&p:nums){
            //当p第一次出现时
            if(!mp.count(p)){
                int left,right;
                left = 0;
                right = 0;
                auto l = mp.find(p-1);
                if(l != mp.end())  left = l->second;
                auto r = mp.find(p+1);
                if(r != mp.end())  right = r->second;
                int cur_len = left + right + 1;
                ans = max(cur_len,ans);
                mp[p] = 1;
                mp[p - left] = cur_len;
                mp[p + right] = cur_len;
            }
        }
        return ans;
    }
};

> 方法五:并查集思想


class Solution {
public:
    unordered_map<int,int> a,b;
    int find(int x){
        //并查集思想,路径压缩
        return a.count(x)?a[x]=find(a[x]):x;
    }
    int longestConsecutive(vector<int>& nums) {
        for(auto i:nums)
            a[i]=i+1;
        int ans=0;
        for(auto i:nums){
            int y=find(i+1);
            ans=max(ans,y-i);
        }
        return ans;
    }
};

标签:right,cur,nums,int,序列,mp,ans,128,最长
From: https://www.cnblogs.com/lihaoxiang/p/17566645.html

相关文章

  • C# 对象序列化和反序列化复制
    ///<summary>///对象深度Copy///</summary>///<typeparamname="T"></typeparam>///<paramname="obj"></param>///<returns></returns>p......
  • 黑群晖DSM7.2安装虚拟机生成序列号
    开启主板虚拟化!!!!存储空间系统格式btrfs 启用网卡OpenVSwitch设置  安装套件VirtualMachineManager      创建虚拟机    下一步直到完成,开启虚拟机  剩下就是链接助手链接虚拟机,配置一下就可以了全部完成后进入系统,打开控制面......
  • python序列
    *鉴于序列协议的重要性,如果没有__iter__和__contains__方法,Python会调用__getitem__方法,设法让迭代和in运算符可用。#猴子补丁当一个类中缺少某个内置方法导致出现不可迭代或者是不可变对象的时候,可以在类的外面定义一个函数,用这个函数给类打补丁。 ......
  • 题解 序列合并
    题目链接首先不难想到,最小数的一定是\(a_1+b_1\),次小的数是\(a_1+b_2\)和\(a_2+b_1\)中小的。得出结论,若\(a_i+b_j\)是第\(k\)小,那么\(a_{i+1}+b_j\)和\(a_i+b_{j+1}\)有可能成为第\(k+1\)小。这是一个很优秀的性质,这意味着我们可以通过最小值推出次小值,再通过......
  • 代码随想录算法训练营第57天 | ● 647. 回文子串 ● 516.最长回文子序列 ● 动
     第九章 动态规划part17●  647. 回文子串  ●  516.最长回文子序列●  动态规划总结篇 今天 我们就要结束动态规划章节了,大家激不激动!!!   详细布置   647. 回文子串    动态规划解决的经典题目,如果没接触过的话,别硬想 直接看题解。https:......
  • 序列变换
    #include<bits/stdc++.h>usingnamespacestd;intmain(intargc,char**argv){ intm,n,a[n]; cin>>n>>m; intx,y,ans,j,k[n]; for(inti=1;i<=n;i++){ cin>>a[i]; } for(inti=0;i<m;i++){ cin>>ans; if(ans==1){......
  • 最长递增子序列
    今天看了hdu的1159,以为是最长递增子序列,然后敲完代码发现samp不对,看了discuss发现原来是lcs最长递增子序列(LIS):求一个序列的LIS有三种算法,一种是排个序然后和自己求最长公共子序列第二种就是dp,dp[i]=max(dp[j])+1;(j∈[0,i-1]),dp[i]表示前i个的LIS的长度,能用这个状态方程肯定......
  • 向量自回归(VAR)模型分析消费者价格指数 (CPI) 和失业率时间序列|附代码数据
    原文链接:http://tecdat.cn/?p=24365最近我们被客户要求撰写关于向量自回归(VAR)模型的研究报告,包括一些图形和统计输出。var对象指定了p阶平稳的多变量向量自回归模型(VAR(p))模型的函数形式并存储了参数值 ( 点击文末“阅读原文”获取完整代码数据******** )。描述varm 对象的......
  • 零基础入门——从零开始学习PHP反序列化笔记(二)
    魔术方法魔术方法介绍__construct()触发时机:实例化对象之前构造函数,在实例化一个对象的时候,首先会去自动执行的一个方法;<?phpclassUser{public$username;publicfunction__construct($username){$this->username=$username;echo"......
  • Integer和int为什么在-128-127之间比较会相等
    原因:因为在Integer.class文件中,有一个静态内部类IntegerCache;会在系统加载时,将(low=-128到h=127)之间的数据提前包装成Integer对象放入数组cache中;inta=111l;Integerc=111l;System.out.println(a==c);//在次会发生自动的装箱,将a转换成Integer在对比字节码文件可......