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

相关推荐
算AI5 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
我不会编程5555 小时前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python
owde6 小时前
顺序容器 -list双向链表
数据结构·c++·链表·list
第404块砖头6 小时前
分享宝藏之List转Markdown
数据结构·list
hyshhhh6 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
蒙奇D索大7 小时前
【数据结构】第六章启航:图论入门——从零掌握有向图、无向图与简单图
c语言·数据结构·考研·改行学it
A旧城以西7 小时前
数据结构(JAVA)单向,双向链表
java·开发语言·数据结构·学习·链表·intellij-idea·idea
杉之7 小时前
选择排序笔记
java·算法·排序算法
烂蜻蜓7 小时前
C 语言中的递归:概念、应用与实例解析
c语言·数据结构·算法
OYangxf7 小时前
图论----拓扑排序
算法·图论