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 <= numsi <= 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;
}
相关推荐
衡石科技18 分钟前
Data_Agent记忆机制与经验复用衡石分析智能体会话记忆与长期学习技术解析
人工智能·科技·学习·算法·企业级bi
shirsl2 小时前
算法 Day 2 滑动窗口 + 栈 / 单调栈
开发语言·python·算法
老王爱玩车2 小时前
深入理解指针2
c语言·开发语言·学习
土司大王3 小时前
LeetCode hot100 回溯专题总结:Java 通用模板、决策树模型
java·算法·leetcode·决策树
2601_962218613 小时前
万象生鲜系统订单全生命周期状态同步技术实现业务可视
大数据·数据库·人工智能·python·算法
那年窗外下的雪.3 小时前
AIDC 学习日志|第 22 天|All-Active/Single-Active 故障演练设计
服务器·网络·学习·算法·哈希算法
wzdark4 小时前
基于启发式搜索的最优路径规划算法研究4
算法
l1t4 小时前
用superpi、tinypi、tpi等工具计算圆周率的比较
c语言·算法
a187927218314 小时前
【算法】链表(二):链表上的双指针——变速、异链与定距,和一份路程账本
数据结构·算法·leetcode·链表·go·指针·环形链表
2601_958352905 小时前
还要写 AEC 算法?0 代码 + 6 个引脚,F-18 让通话清晰度提升 300%
人工智能·算法·降噪消回音