LeetCode题练习与总结:最长连续序列--128

news/2024/7/1 2:53:38

一、题目描述

给定一个未排序的整数数组 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

二、解题思路

要设计一个时间复杂度为O(n)的算法,我们可以使用哈希集合(HashSet)来存储数组中的所有数字。然后,我们可以遍历数组中的每个数字,对于每个数字,我们检查其是否为某个连续序列的最小数字。如果是,我们就更新最长连续序列的长度。

算法步骤如下:

  1. 将数组中的所有数字添加到哈希集合中。
  2. 遍历数组中的每个数字,对于每个数字,如果其在哈希集合中且其前一个数字不在哈希集合中,那么这个数字就是某个连续序列的最小数字。
  3. 对于每个这样的最小数字,我们可以计算以其为起点的连续序列的长度,并更新最长连续序列的长度。

三、具体代码

import java.util.HashSet;
import java.util.Set;

public class Solution {
    public int longestConsecutive(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }

        Set<Integer> numSet = new HashSet<>();
        for (int num : nums) {
            numSet.add(num);
        }

        int longestStreak = 0;
        for (int num : nums) {
            if (!numSet.contains(num - 1)) {
                int currentNum = num;
                int currentStreak = 1;

                while (numSet.contains(currentNum + 1)) {
                    currentNum++;
                    currentStreak++;
                }

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

        return longestStreak;
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 将数组中的所有数字添加到哈希集合中:这一步的时间复杂度是O(n),因为我们需要遍历数组中的每个数字一次,并将它们添加到哈希集合中。哈希集合的添加操作通常是O(1)的时间复杂度。
  • 遍历数组中的每个数字,并计算以它们为起点的连续序列的长度:这一步的时间复杂度也是O(n),因为我们需要遍历数组中的每个数字一次。对于每个数字,我们可能会计算以其为起点的连续序列的长度,这个计算过程在最坏情况下会遍历整个数组,但是由于哈希集合的存在,每个数字只会被计算一次。因此,这一步的整体时间复杂度仍然是O(n)。
  • 综上所述,整个算法的时间复杂度是O(n)。
2. 空间复杂度
  • 哈希集合:我们需要一个哈希集合来存储数组中的所有数字,因此空间复杂度是O(n),其中n是数组中数字的数量。
  • 综上所述,整个算法的空间复杂度是O(n)。

五、总结知识点

  1. 哈希集合(HashSet):用于存储数组中的所有数字,以便快速判断一个数字是否存在于数组中。哈希集合的特点是添加和查找操作的平均时间复杂度为O(1)。

  2. 数组遍历:使用for-each循环遍历数组中的每个元素。

  3. 条件语句:使用if语句来检查数字是否为某个连续序列的最小数字。

  4. 循环结构:使用while循环来找到以某个数字为起点的最长连续序列。

  5. 数学运算:使用加减法来生成连续序列中的下一个数字,并使用Math.max函数来更新最长连续序列的长度。

  6. 函数定义:定义了一个名为longestConsecutive的公共方法,该方法接受一个整数数组作为参数,并返回一个整数作为结果。

  7. 异常处理:检查输入数组是否为null或长度为0,如果是,则直接返回0,这是一种简单的异常处理方式。

  8. 变量声明和赋值:声明了多个变量来存储当前的数字、当前的连续序列长度和最长的连续序列长度。

  9. 算法设计:整个代码的核心是设计了一个时间复杂度为O(n)的算法来找到最长的连续序列,这涉及到对问题的分析和解决方案的设计。

  10. 代码结构:代码遵循了良好的结构,先处理特殊情况,然后是主要逻辑,最后返回结果。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。


http://lihuaxi.xjx100.cn/news/2215494.html

相关文章

linux下C语言如何操作文件(一)

本篇我们简单介绍一下在linux中如何使用C语言操作文件,首先我们在项目中创建file_util.c源文件和file_util.h头文件如图: 我们先编辑file_util.h文件,定义好常用的函数,源代码如下: #ifndef FILE_UTIL_INCLUDED #define FILE_UTIL_INCLUDED#include <stdbool.h> #i…

docker镜像拉取失败,K8s的calicoPod出现Init:ImagePullBackOff问题的解决

配置k8s集群出现问题 起初以为是版本问题&#xff0c;最后比对了一下发现没有问题。使用 kubectl describe calico-node-mg9xh -n kube-system命令查看发现docker pull 镜像失败&#xff0c;但是docker国内镜像源早就配置过了。 猜测Docker的缓存可能会导致拉取镜像失败。尝试…

将自己md文件发布到自己的博客园实现文件的持久化存储

上传markdown文件到博客园 目录 【0】需求原因【1】功能【2】环境【最佳实践测试】 &#xff08;1&#xff09;查看 Typora 设置&#xff08;2&#xff09;配置 pycnblog 配置文件 config.yaml&#xff08;3&#xff09;运行 pycnblog 中的文件 cnblog_markdown.cmd&#xff0…

边缘微型AI的宿主?—— RISC-V芯片

一、RISC-V技术 RISC-V&#xff08;发音为 "risk-five"&#xff09;是一种基于精简指令集计算&#xff08;RISC&#xff09;原则的开放源代码指令集架构&#xff08;ISA&#xff09;。它由加州大学伯克利分校在2010年首次发布&#xff0c;并迅速获得了全球学术界和工…

Qt状态机框架

概述 状态机框架提供了用于创建和执行状态图的类。这些概念和符号基于Harel的Statecharts:复杂系统的可视化形式(http://www.wisdom.weizmann.ac.il/~dharel/SCANNED.PAPERS/Statecharts.pdf)&#xff0c;也是UML状态图的基础。状态机执行的语义基于状态图XML (SCXML)(http://…

vue中的依赖管理

第1部分&#xff1a;引言 1.1 Vue框架简介 Vue.js是一个用于构建用户界面的渐进式框架。它从核心出发&#xff0c;易于学习和集成&#xff0c;同时提供丰富的生态系统支持&#xff0c;包括但不限于Vuex状态管理、Vue Router路由管理等。Vue的核心库只关注视图层&#xff0c;易…

每日一练——用队列实现栈

225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; Queue.h #pragma once #include<stdlib.h> #include<assert.h> #include<stdbool.h>typedef int QDataType;typedef struct QNode {QDataType data;struct QNode* next; } QNode;typedef struct …

详解拦截器(interceptor)

目录 1.拦截器概述 2.拦截器的基本使用 3.拦截路径配置 4.拦截器执行流程 5.实现登录校验 5.1定义拦截器 5.2注册配置拦截器 6.DispatcherServlet源码分析 6.1初始化 6.2处理请求&#xff08;核心&#xff09; 7.适配器模式 1.拦截器概述 拦截器&#xff08;Inte…