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;
}
相关推荐
待什么青丝17 分钟前
【TMS570LC4357】之工程创建
c语言·单片机
Dante7981 小时前
【数据结构】二叉搜索树、平衡搜索树、红黑树
数据结构·c++·算法
白羊不吃白菜2 小时前
PAT乙级(1101 B是A的多少倍)C语言解析
c语言·开发语言
驼驼学编程2 小时前
决策树,Laplace 剪枝与感知机
算法·决策树·剪枝
坚强小葵2 小时前
实验8-2-1 找最小的字符串
c语言·算法
@陽光總在風雨後2 小时前
调试正常 ≠ 运行正常:Keil5中MicroLIB的“量子态BUG”破解实录
c语言·arm开发·stm32·单片机·嵌入式硬件
apcipot_rain2 小时前
【密码学——基础理论与应用】李子臣编著 第三章 分组密码 课后习题
python·算法·密码学
亭墨2 小时前
linux0.11内核源码修仙传第六章——中断初始化
linux·c语言·驱动开发·学习·面试
lucky1_1star2 小时前
FX-函数重载、重写(覆盖)、隐藏
java·c++·算法
aiprtem3 小时前
LVGL组件设计之模拟桌面
linux·c语言·网络·物联网