Leetcode 每日一题 128.最长连续序列

目录

问题描述

示例

[示例 1](#示例 1)

[示例 2](#示例 2)

提示

过题图片

[解法一:HashSet 版](#解法一:HashSet 版)

思路

步骤

代码实现

[解法二:HashMap 版](#解法二:HashMap 版)

思路

步骤

代码实现

题目链接

总结


问题描述

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

过题图片

解法一:HashSet 版

思路

利用 HashSet 存储数组中的元素,然后遍历数组,对于每个元素,检查其前后元素是否存在于 HashSet 中,以此来确定连续序列的长度。

步骤

  1. 初始化 :定义一个 HashSet 来存储数组中的所有元素,以及两个变量 max 用来记录最长连续序列的长度,sum 用来记录当前连续序列的长度。

  2. 填充 HashSet :遍历数组 nums,将所有元素添加到 HashSet 中。

  3. 寻找连续序列 :再次遍历数组 nums,对于每个元素 num

    • 如果 num - 1 存在于 HashSet 中,说明 num 不是连续序列的起点,继续下一个循环。
    • 如果 num - 1 不存在于 HashSet 中,那么 num 是一个连续序列的起点,将 sum 设置为 1(当前序列的长度)。
    • 检查 num + 1 是否存在于 HashSet 中,如果存在,则增加 sum,直到不存在为止,表示连续序列结束。
    • 更新 maxsummax 中的较大值。
  4. 返回结果 :遍历结束后,max 即为所求的最长连续序列的长度。

代码实现

复制代码

java

复制代码
class Solution {
    public int longestConsecutive(int[] nums) {
        int sum = 1;
        int max = 0;
        Arrays.sort(nums);
        Set<Integer> set = new HashSet<>();
        for (int num : nums) {
            if (set.contains(num)){
                continue;
            }
            else if (set.contains(num - 1)) {
                sum++;
            } else {
                sum = 1;
            }
            max = Math.max(max, sum);
            set.add(num);
        }
        return max;
    }
}

解法二:HashMap 版

思路

首先对数组进行排序,然后使用 HashMap 来存储每个数字和其连续序列的列表。对于每个数字,如果它不是当前连续序列的下一个数字,则开始一个新的连续序列。最后,遍历 HashMap 来找到最长的连续序列。

步骤

  1. 初始化 :定义一个 HashMap 来存储每个数字及其连续序列的列表,以及一个变量 max 用来记录最长连续序列的长度。

  2. 排序数组 :对数组 nums 进行排序。

  3. 构建连续序列 :遍历排序后的数组 nums,对于每个元素 num

    • 如果 num 不等于 num - 1(即 num 不是重复的),则以 num 为起点开始构建一个新的连续序列。
    • 如果 num 等于 num - 1 + 1,则将 num 添加到前一个数字的连续序列中。
    • 如果 num 不等于 num - 1 且不等于 num + 1 - 1,则 num 是一个新的连续序列的起点,创建一个新的列表并添加到 HashMap 中。
  4. 寻找最长连续序列 :遍历 HashMap 中的所有值(即所有连续序列的列表),更新 max 为当前序列长度和 max 中的较大值。

  5. 返回结果 :遍历结束后,max 即为所求的最长连续序列的长度。

代码实现

复制代码

java

复制代码
class Solution {
    public int longestConsecutive(int[] nums) {
        HashMap<Integer,List<Integer>> map = new HashMap<>();
        Arrays.sort(nums);
        int j=0;
        for(int i=0;i<nums.length;i++){
            List<Integer> list = map.getOrDefault(nums[j], new ArrayList<Integer>());
            if(i==0)
            list.add(nums[i]);
            else if(nums[i]==nums[i-1]+1)
            list.add(nums[i]);
            else if(nums[i]!=nums[i-1]){
                j=i;
                System.out.println(j);
                List<Integer> list1 = map.getOrDefault(nums[j], new ArrayList<Integer>());
                list1.add(nums[j]);
                map.put(nums[j],list1);
                continue;
            }
            map.put(nums[j],list);
        }
        int max=0;
        for (List<Integer> num : map.values()) {
              max = Math.max(max, num.size());
        }
        System.out.println(map);
        return max;
    }
}

题目链接

128. 最长连续序列 - 力扣(LeetCode)

总结

两种解法都利用了 HashSet 或 HashMap 来减少查找的时间复杂度,使得整体的时间复杂度为 O(n)。HashSet 版的解法更为简洁,而 HashMap 版的解法则提供了一种不同的思路。

相关推荐
眼镜哥(with glasses)1 小时前
蓝桥杯 国赛2024python(b组)题目(1-3)
数据结构·算法·蓝桥杯
int型码农5 小时前
数据结构第八章(一) 插入排序
c语言·数据结构·算法·排序算法·希尔排序
UFIT6 小时前
NoSQL之redis哨兵
java·前端·算法
喜欢吃燃面6 小时前
C++刷题:日期模拟(1)
c++·学习·算法
SHERlocked936 小时前
CPP 从 0 到 1 完成一个支持 future/promise 的 Windows 异步串口通信库
c++·算法·promise
怀旧,6 小时前
【数据结构】6. 时间与空间复杂度
java·数据结构·算法
积极向上的向日葵6 小时前
有效的括号题解
数据结构·算法·
GIS小天6 小时前
AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月7日第101弹
人工智能·算法·机器学习·彩票
_Itachi__6 小时前
LeetCode 热题 100 74. 搜索二维矩阵
算法·leetcode·矩阵
不忘不弃6 小时前
计算矩阵A和B的乘积
线性代数·算法·矩阵