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 版的解法则提供了一种不同的思路。

相关推荐
夏末秋也凉13 分钟前
力扣-贪心-376 摆动序列
算法·leetcode
刃神太酷啦40 分钟前
堆和priority_queue
数据结构·c++·蓝桥杯c++组
Orange--Lin1 小时前
【用deepseek和chatgpt做算法竞赛】——还得DeepSeek来 -Minimum Cost Trees_5
人工智能·算法·chatgpt
01_1 小时前
力扣hot100 ——搜索二维矩阵 || m+n复杂度优化解法
算法·leetcode·矩阵
SylviaW081 小时前
python-leetcode 35.二叉树的中序遍历
算法·leetcode·职场和发展
篮l球场1 小时前
LeetCodehot 力扣热题100
算法·leetcode·职场和发展
pzx_0011 小时前
【机器学习】K折交叉验证(K-Fold Cross-Validation)
人工智能·深度学习·算法·机器学习
BanLul1 小时前
进程与线程 (三)——线程间通信
c语言·开发语言·算法
落羽的落羽1 小时前
【落羽的落羽 数据结构篇】栈和队列
c语言·数据结构
qy发大财2 小时前
分发糖果(力扣135)
数据结构·算法·leetcode