LeetCode 128. 最长连续序列

简介: LeetCode 128. 最长连续序列

 LeetCode 128. 最长连续序列

给定一个未排序的整数数组 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 <= 105
  • -109 <= nums[i] <= 109


思路

      可参考 官方题解思路

    • 借助map这一数据结构来存储和去重nums数组元素
    • 遍历map,判断当前遍历到的num是否可以作为某个连续序列的首元素,即借助map判断是否还有比当前num还小的元素
      • 如果map中没有比当前num还小的元素,那么该元素就可以作为某个连续序列的首元素。我们继续寻找以该num为首元素的后继连续序列,即判断:num+1,num+2,...,num+n是否存在,这一过程中顺便记录这个连续序列的长度length。
      • 如果map中比当前num还小的元素,那么该元素就不可以作为某个连续序列的首元素,我们直接跳过即可,不予理会。

        时间复杂度:O(n),其中 n 为数组的长度。虽然存在双层for循环,但是内层for循环实际上已经continue 跳过了很多 “当前num不能作为首元素的连续序列” 了。


        空间复杂度:O(n),哈希表存储数组中所有的数需要 O(n) 的空间

        // 可参考官方题解思路:https://leetcode.cn/problems/longest-consecutive-sequence/solutions/276931/zui-chang-lian-xu-xu-lie-by-leetcode-solution/?languageTags=golangfunclongestConsecutive(nums []int) int {
        maxLength, m :=0, make(map[int]struct{})
        fori :=0; i<len(nums); i++ {
        m[nums[i]] =struct{}{}
            }
        fornum, _ :=rangem {
        // 不存在比当前num还小的数,说明当前num已经是某个连续序列的首元素了if_, ok :=m[num-1]; !ok { 
        // 继续找以当前num为首的连续序列,并记录连续序列的长度j, length :=1, 1for {
        if_, ok :=m[num+j]; ok {
        length++j++                } else {
        break                }
                    }
        ifmaxLength<length {
        maxLength=length            }
        // else: 存在比当前num还小的数,说明当前num并不是某个连续序列的首元素,直接跳过        }
            }
        returnmaxLength}
        // func longestConsecutive(nums []int) int {//  maxLength, m := 0, make(map[int]struct{})//  for i := 0; i < len(nums); i++ {//      m[nums[i]] = struct{}{}//  }//  for num, _ := range m {//         // 存在比当前num还小的数,说明当前num并不是某个连续序列的首元素,跳过,继续找比它更小的首元素//      if _, ok := m[num-1]; ok {//          continue//      }//      // 已经找到某个连续序列的首元素了//      j, length := 1, 1//      for {//          if _, ok := m[num+j]; ok {//              length++//              j++//          } else {//              break//          }//      }//      if maxLength < length {//          maxLength = length//      }//  }//  return maxLength// }// // 超时:由于第二个for循环是对nums数组的每个num去重复寻找其后继元素,并未证明当前num可以作为某个连续序列的首元素(即当前num已经是某个连续序列中最小的一个)。// // 借助map判断,如果当前num不是某个连续序列的首元素,直接跳过即可,无需重复判断// func longestConsecutive(nums []int) int {//  res, m := 0, make(map[int]struct{})//  for i := 0; i < len(nums); i++ {//      m[nums[i]] = struct{}{}//  }//  for i := 0; i < len(nums); i++ {//      j, length := 1, 1//      for {//          if _, ok := m[nums[i]+j]; ok {//              length++//              j++//          } else {//              break//          }//      }//      if res < length {//          res = length//      }//  }//  return res// }

        image.gif


        目录
        相关文章
        |
        Python
        【Leetcode刷题Python】376. 摆动序列
        文章提供了解决LeetCode "摆动序列" 问题的Python实现代码,通过遍历整数数组并使用两个变量 down 和 up 来记录正差和负差摆动序列的长度,最终返回最长摆动子序列的长度。
        203 0
        |
        存储 算法
        《LeetCode》—— 摆动序列
        《LeetCode》—— 摆动序列
        219 0
        |
        算法 测试技术 C#
        【单调栈】LeetCode2030:含特定字母的最小子序列
        【单调栈】LeetCode2030:含特定字母的最小子序列
        |
        7月前
        |
        存储 C++ 索引
        最长连续序列(每天刷力扣hot100系列)
        本题使用哈希表法求最长连续序列。利用unordered_set存储去重元素,遍历集合时仅当num-1不存在时才作为起点向后扩展,统计连续长度,时间复杂度O(n),空间复杂度O(n)。相比unordered_map更高效,因无需存储值。
        |
        11月前
        |
        Go
        【LeetCode 热题100】DP 实战进阶:最长递增子序列、乘积最大子数组、分割等和子集(力扣300 / 152/ 416 )(Go语言版)
        本文深入解析三道经典的动态规划问题:**最长递增子序列(LIS)**、**乘积最大子数组** 和 **分割等和子集**。 - **300. LIS** 通过 `dp[i]` 表示以第 `i` 个元素结尾的最长递增子序列长度,支持 O(n²) 动态规划与 O(n log n) 的二分优化。 - **152. 乘积最大子数组** 利用正负数特性,同时维护最大值与最小值的状态转移方程。 - **416. 分割等和子集** 转化为 0-1 背包问题,通过布尔型 DP 实现子集和判断。 总结对比了三题的状态定义与解法技巧,并延伸至相关变种问题,助你掌握动态规划的核心思想与灵活应用!
        429 1
        |
        Python
        【Leetcode刷题Python】946. 验证栈序列
        LeetCode题目“946. 验证栈序列”的Python解决方案,通过模拟栈的压入和弹出操作来验证给定的两个序列是否能通过合法的栈操作得到。
        231 6
        |
        算法 Python
        【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
        本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
        179 3
        |
        Python
        【Leetcode刷题Python】105. 从前序与中序遍历序列构造二叉树
        LeetCode上105号问题"从前序与中序遍历序列构造二叉树"的Python实现,通过递归方法根据前序和中序遍历序列重建二叉树。
        318 3
        |
        算法 Python
        【Leetcode刷题Python】300. 最长递增子序列
        LeetCode 300题 "最长递增子序列" 的两种Python解决方案:一种使用动态规划,另一种使用贪心算法结合二分查找。
        248 1
        |
        存储 算法 数据可视化
        哈希表法快速求解最长连续序列 | 力扣128题详细解析
        哈希表法快速求解最长连续序列 | 力扣128题详细解析