leetcode128.最长连续序列

题目描述

给定一个未排序的整数数组 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

提示:

0 <= nums.length <= 10^5

-109 <= nums[i] <= 10^9

解题思路

方法一:排序+双指针

c 复制代码
int cmp(const void *a,const void *b){
    return (*(int*)a)-(*(int*)b);
}
int longestConsecutive(int* nums, int numsSize) {
    qsort(nums,numsSize,sizeof(int),cmp);
    int low=0;
    int ans=1;//数组长度为1,ans不更新
    int cur=1;
    for(int fast=1;fast<numsSize;fast++){
        if(nums[low]==nums[fast])
            continue;
        else if(nums[low]+1==nums[fast]){
            cur++;
            ans=fmax(ans,cur);
        }
        else
            cur=1;
            low=fast;
    }
    return numsSize>0?ans:0;
}

方法二:哈希表

c 复制代码
int longestConsecutive(int* nums, int numsSize) {
    // 创建哈希表
    int* hash_table = (int*)calloc(1000000, sizeof(int));
    
    // 将数字存入哈希表
    for (int i = 0; i < numsSize; i++) {
        hash_table[nums[i] + 500000] = 1;
    }
    
    int longestStreak = 0;
    
    // 遍历哈希表,找到最长的连续序列
    for (int i = 0; i < 1000000; i++) {
        if (hash_table[i]) {
            int currentNum = i - 500000;
            int currentStreak = 1;
            
            while (hash_table[i + 1]) {
                currentNum += 1;
                currentStreak += 1;
                i++;
            }
            
            longestStreak = (currentStreak > longestStreak) ? currentStreak : longestStreak;
        }
    }
    
    free(hash_table);
    return longestStreak;
}
相关推荐
NAGNIP7 小时前
一文搞懂树模型与集成模型
算法·面试
NAGNIP7 小时前
万字长文!一文搞懂监督学习中的分类模型!
算法·面试
技术狂人1687 小时前
工业大模型工程化部署实战!4 卡 L40S 高可用集群(动态资源调度 + 监控告警 + 国产化适配)
人工智能·算法·面试·职场和发展·vllm
D_FW8 小时前
数据结构第六章:图
数据结构·算法
你怎么知道我是队长8 小时前
C语言---头文件
c语言·开发语言
a程序小傲8 小时前
京东Java面试被问:动态规划的状态压缩和优化技巧
java·开发语言·mysql·算法·adb·postgresql·深度优先
自学不成才8 小时前
深度复盘:一次flutter应用基于内存取证的黑盒加密破解实录并完善算法推理助手
c++·python·算法·数据挖掘
3有青年9 小时前
nios ii 中 ‘ALT_CPU_FREQ‘ could not be resolved的分析和解决办法
c语言·fpga开发
June`9 小时前
全排列与子集算法精解
算法·leetcode·深度优先