128. 最长连续序列

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

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

解题思路:

  1. 将所有元素添加到集合中: 这样可以在 O(1) 时间内检查某个元素是否存在。
  2. 遍历集合中的每个元素: 如果当前元素的前驱元素(即 num - 1)不存在于集合中,则说明当前元素是一个连续序列的起点。 接着,顺序查找当前元素的后续元素,计算当前序列的长度。
  3. 记录最长的序列长度: 在遍历过程中,保持记录最大序列长度。
func longestConsecutive(nums []int) int {
    
      var numSet = make(map[int]bool)
      for _, num := range nums {
          numSet[num] = true
      }
      
      var result int
      // 检查 num-1 是否存在集合,即可判断是否是序列起点
      for num := range numSet {
      
          if !numSet[num-1] {
              currNum := num
              currSeq := 1
      
              for numSet[currNum+1] {
                  currNum++
                  currSeq++
              }
              if currSeq > result {
                  result = currSeq
      
              }
          }
      }
      
      return result
}