最长连续序列

🔗 最长连续序列

题目来源:128. 最长连续序列 – 力扣(LeetCode)


📌 题目描述

给定一个未排序的整数数组 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,1,2,3,4,5,6,7,8] 或 [1,2,3,4,5,6,7,8,9],长度为 9。

示例 3:

  • 输入nums = [1,0,1,2]
  • 输出3
  • 解释:最长连续序列为 [0,1,2],注意重复元素只算一次。

⚠️ 提示

  • 0 <= nums.length <= 10⁵
  • -10⁹ <= nums[i] <= 10⁹
  • 要求时间复杂度:O(n)

💡 解法:哈希表 + 起点优化(O(n) 时间)

class Solution {
public int longestConsecutive(int[] nums) {
Set<Integer> numSet = new HashSet<>();
for (int num : nums) {
numSet.add(num);
}

int maxLength = 0;

for (int num : numSet) {
if (!numSet.contains(num - 1)) {
int currentNum = num;
int currentStreak = 1;
while (numSet.contains(currentNum + 1)) {
currentNum++;
currentStreak++;
}

maxLength = Math.max(maxLength, currentStreak);
}
}

return maxLength;
}
}

📊 复杂度分析

  • 时间复杂度:O(n)
    • 每个数字最多被访问两次(作为起点或被跳过),均摊 O(1)
  • 空间复杂度:O(n)
    • HashSet 存储去重后的所有元素

🧩 解题思路

  1. 使用 HashSet 去重并支持 O(1) 查找
  2. 关键优化:只从“连续序列的起点”开始统计
    • 如果 num - 1 存在,说明 num 不是起点,跳过
    • 只有当 num - 1 不存在时,才以 num 为起点向上延伸
  3. 统计连续长度:从起点不断查找 num+1num+2, … 直到中断
  4. 更新最大长度
文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇