算法最优解 算法最优解
首页
目录
赞助
GitHub (opens new window)
首页
目录
赞助
GitHub (opens new window)
  • 数据结构基础

  • 数组

  • 位运算

  • 动态规划

  • 图

    • 克隆图
    • 课程表
    • 太平洋大西洋水流问题
    • 岛屿的数量
    • 最长连续序列
      • 题目描述
      • 思路解析
      • C++代码
      • 复杂度分析
  • 区间

  • 链表

  • 矩阵

  • 字符串

  • 树

  • 堆

  • 逻辑思维

  • 目录
  • 图
华南溜达虎
2024-07-08
目录

最长连续序列

题目链接: https://leetcode.cn/problems/longest-consecutive-sequence/

# LeetCode 128. 最长连续序列

# 题目描述

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

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

举个例子:

输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。

# 思路解析

本题的思路比较类似于广度优先搜索。

  1. 把数组nums的所有元素存到hashset中。
  2. 遍历数组nums,明确连续序列的起点,对于数组nums中的元素num,如果num - 1不在hashset中,就把num作为一个连续序列的起点,进入步骤3。
  3. 从连续序列的起点num开始,不断去hashset中寻找num + i,i >= 1。直到num + len不在hashset中(以num为起点的序列此后就不再连续),更新最长连续序列的长度max_len = max(max_len, len)。如果数组nums已遍历完,进入步骤4,否则进入步骤2。
  4. 返回max_len。

# C++代码

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        int max_len = 0;
        unordered_set<long long> nums_set;
        int nums_len = nums.size();
        //把所有的元素保存在set中
        for (int i = 0; i < nums_len; ++i) {
            nums_set.emplace(nums[i]);
        }

        for (auto& num:nums) {
            //num-1不在set中 保证num是连续序列的起始元素
            if (nums_set.find(num - 1) == nums_set.end()) {
                int len = 0;
                //num+len在set中 说明num~num+len是连续的
                while (nums_set.find(num + len) != nums_set.end()) {
                    ++len;
                    max_len = max(len, max_len);
                }
            }
        }
        return max_len;
    }
};

# 复杂度分析

时间复杂度: O(n),只需要遍历一遍数组,其中n为数组的大小。

空间复杂度: O(n),需要借助一个hashset,其中n为数组的大小。

上次更新: 2024/07/08, 19:42:39
岛屿的数量
插入区间

← 岛屿的数量 插入区间→

Theme by Vdoing | Copyright © 2024-2024 华南溜达虎 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式