LeetCode128.最长连续序列

2024-03-05 1041阅读

温馨提示:这篇文章已超过385天没有更新,请注意相关的内容是否还可用!

题目

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

LeetCode128.最长连续序列
(图片来源网络,侵删)

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例

输入:nums = [100,4,200,1,3,2]

输出:4

解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。

输入:nums = [0,3,7,2,5,8,4,6,0,1]

输出:9

思路

由于题目要求的时间复杂度为O(n),我们看到题目第一时间想到的可能是使用快排然后去寻找数字连续的最长序列,但是使用快排的时间复杂度为O(n*logn),使用快排肯定会超时,所以我们可以使用哈希表。

时间复杂度为 O(n) 的哈希表思路:

  1. 创建一个哈希表,用于存储数组中的数字及其对应的连续序列长度。
  2. 遍历数组,对于每个数字 num,执行以下操作:
    • 检查哈希表中是否存在 num,如果存在则跳过当前数字。
    • 获取 num 左侧连续序列的长度 left(从 num-1 开始向左遍历,递减检查哈希表中的数字并累加长度),获取 num 右侧连续序列的长度 right(从 num+1 开始向右遍历,递增检查哈希表中的数字并累加长度)。
    • 计算当前连续序列的长度 length = left + right + 1(加上当前数字 num)。
    • 更新哈希表中 num、num-left 和 num+right 的值为 length,以及更新 maxLength 的值为最长的连续序列长度。
    • 返回 maxLength。

通过使用哈希表,我们可以快速查找数字是否存在,并且在 O(1) 的时间复杂度内获取连续序列的长度。因此,整体算法的时间复杂度为 O(n)。

Code

class Solution {
public:
    int longestConsecutive(vector& nums) {
        unordered_map map;
        int maxLength = 0;
        for (int num : nums) {
            if (map.find(num) == map.end()) {
                int left = map.find(num - 1) != map.end() ? map[num - 1] : 0;
                int right = map.find(num + 1) != map.end() ? map[num + 1] : 0;
                int length = left + right + 1;
                map[num] = length;
                // 更新连续序列两端的长度
                map[num - left] = length;
                map[num + right] = length;
                maxLength = max(maxLength, length);
            }
        }
        return maxLength;
    }
};
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]