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

示例 3:

输入:nums = [1,0,1,2]

输出:3

提示:

0 <= nums.length <= 105

-109 <= nums[i] <= 109

  1. 思路一:首先排个序,然后双指针思路。当前的数减去前一个数等于一,temp++。相等就继续。不相等就更新结果,temp重新赋值为1。

  2. 思路二:将所有的值加入到set中,去重。然后遍历set元素,判断当前元素是否为第一个开头的元素(num-1是否在集合中),为开头,从当前元素值开始加一,直到值不在set中。

  3. 思路三:直接使用TreeSet。将所有元素值加入TreeSet中,遍历,取出当前值,当前值和前一个值相差为一,temp++,不为1,更新结果。

c 复制代码
class Solution {
    public int longestConsecutive(int[] nums) {
        if(nums.length==0)return 0;
        if(nums.length==1)return 1;
        Arrays.sort(nums);
        int start = 0;
        int maxLen = 0;
        int i = 0;
        int temp = 1;
        for(i = 0;i<nums.length;i++){
            if(i==0){
                continue;
            }else if(nums[i]-nums[i-1]==1){
                temp++;
            }else if(nums[i]!=nums[i-1]){
                maxLen = Math.max(maxLen, temp);
                temp = 1;
            }
        }
        return Math.max(maxLen,temp);
    }
}
c 复制代码
class Solution {
    public int longestConsecutive(int[] nums) {
        Set<Integer> s = new HashSet<>();
        for(int i = 0; i < nums.length; i++){
            s.add(nums[i]);
        }
        int maxLen = 0;
        for(int x:s){
        	// 当前元素为一个序列的开头元素
            if(!s.contains(x-1)){
                int t = x+1;
                // 值加一判断是否在集合中
                while(s.contains(t)){
                    t++;
                }
                // 更新结果
                maxLen = Math.max(maxLen, t-x);
            }
        }
        return maxLen;
    }
}
c 复制代码
class Solution {
    public int longestConsecutive(int[] nums) {
        TreeSet<Integer> treeSet = new TreeSet<>();
        for(int i = 0;i<nums.length;i++){
            treeSet.add(nums[i]);
        }
        int temp = 0;
        Integer pre = Integer.MIN_VALUE;
        Integer maxLen = 0;
        for(Integer x:treeSet){
            if(x-pre==1){
                temp++;
            }else{
                maxLen = Math.max(maxLen, temp);
                temp = 1;
            }
            pre = x;
        }
        return Math.max(maxLen,temp);
    }
}
相关推荐
算法鑫探2 小时前
闰年判断:C语言实战解析
c语言·数据结构·算法·新人首发
WBluuue3 小时前
数据结构与算法:康托展开、约瑟夫环、完美洗牌
c++·算法
木子墨5163 小时前
LeetCode 热题 100 精讲 | 并查集篇:最长连续序列 · 岛屿数量 · 省份数量 · 冗余连接 · 等式方程的可满足性
数据结构·c++·算法·leetcode
2501_921960854 小时前
双相自指图与弦论边界非对易性的结构同源
数据结构
王老师青少年编程4 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:均分纸牌
c++·算法·编程·贪心·csp·信奥赛·均分纸牌
EQUINOX14 小时前
2026年码蹄杯 本科院校赛道&青少年挑战赛道提高组初赛(省赛)第一场,个人题解
算法
萝卜小白4 小时前
算法实习Day04-MinerU2.5-pro
人工智能·算法·机器学习
Liangwei Lin4 小时前
洛谷 P3133 [USACO16JAN] Radio Contact G
数据结构·算法
weixin_513449965 小时前
PCA、SVD 、 ICP 、kd-tree算法的简单整理总结
c++·人工智能·学习·算法·机器人
code_pgf5 小时前
Qwen2.5-VL 算法解析
人工智能·深度学习·算法·transformer