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);
    }
}
相关推荐
CoovallyAIHub7 小时前
Moonshine:比 Whisper 快 100 倍的端侧语音识别神器,Star 6.6K!
深度学习·算法·计算机视觉
CoovallyAIHub8 小时前
速度暴涨10倍、成本暴降6倍!Mercury 2用扩散取代自回归,重新定义LLM推理速度
深度学习·算法·计算机视觉
CoovallyAIHub8 小时前
实时视觉AI智能体框架来了!Vision Agents 狂揽7K Star,延迟低至30ms,YOLO+Gemini实时联动!
算法·架构·github
CoovallyAIHub8 小时前
开源:YOLO最强对手?D-FINE目标检测与实例分割框架深度解析
人工智能·算法·github
CoovallyAIHub9 小时前
OpenClaw:从“19万星标”到“行业封杀”,这只“赛博龙虾”究竟触动了谁的神经?
算法·架构·github
刀法如飞9 小时前
程序员必须知道的核心算法思想
算法·编程开发·算法思想
徐小夕10 小时前
pxcharts Ultra V2.3更新:多维表一键导出 PDF,渲染兼容性拉满!
vue.js·算法·github
CoovallyAIHub11 小时前
OpenClaw一脚踩碎传统CV?机器终于不再只是看世界
深度学习·算法·计算机视觉
CoovallyAIHub11 小时前
仅凭单目相机实现3D锥桶定位?UNet-RKNet破解自动驾驶锥桶检测难题
深度学习·算法·计算机视觉