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

相关推荐
张人玉15 分钟前
VisionPro Blob、条码识别、OCR 结构化速记版
人工智能·算法·机器学习·vsionpro
数智工坊23 分钟前
【数据结构-栈】3.1栈的顺序存储-链式存储
java·开发语言·数据结构
愚者游世29 分钟前
力扣解决二进制&题型常用知识点梳理
c++·程序人生·算法·leetcode·职场和发展·改行学it
圣保罗的大教堂30 分钟前
leetcode 3640. 三段式数组 II 困难
leetcode
Geoking.33 分钟前
前缀和算法:从一道 LeetCode 题看区间求和优化思想
算法·leetcode·职场和发展
爱吃rabbit的mq36 分钟前
第7章 逻辑回归:二分类的基础
算法·分类·逻辑回归
DFT计算杂谈37 分钟前
VASP+Wannier90 计算位移电流和二次谐波SHG
java·服务器·前端·python·算法
执着25943 分钟前
力扣102、二叉树的层序遍历
数据结构·算法·leetcode
Tisfy1 小时前
LeetCode 2976.转换字符串的最小成本 I:floyd算法(全源最短路)
算法·leetcode··floyd·题解
元亓亓亓1 小时前
考研408--数据结构--day5--栈与队列的应用
数据结构·考研··408·队列