CC23-最长的连续元素序列长度

目录

一、题目描述

二、解题思路

三、代码实现

四、代码解释

五、复杂度分析


一、题目描述

给定一个无序的整数类型数组,要求找出最长的连续元素序列的长度,并且需要给出时间复杂度在 O(n) 之内的算法。

示例 :输入:[1000, 4, 2000, 1, 3, 2],返回值:4(最长连续元素序列为 [1, 2, 3, 4])。

二、解题思路

采用哈希集合 + 遍历起点的方法:

  1. 首先将数组中的所有元素存入哈希集合,以便快速判断一个元素是否存在。
  2. 遍历集合中的每个元素,仅当该元素是某连续序列的起点(即 n-1 不存在于集合中)时,才向后遍历寻找连续的元素,统计该连续序列的长度。
  3. 维护一个最大值,记录所有连续序列长度的最大值,最终返回该最大值。

三、代码实现

复制代码
import java.util.*;

public class Solution {
    public int longestConsecutive(int[] num) {
        if (num == null || num.length == 0) {
            return 0;
        }
        Set<Integer> set = new HashSet<>();
        // 将数组元素存入哈希集合,用于快速查找
        for (int n : num) {
            set.add(n);
        }
        int maxLen = 0;
        for (int n : set) {
            // 只处理连续序列的起点(即n-1不存在的情况)
            if (!set.contains(n - 1)) {
                int current = n;
                int currentLen = 1;
                // 向后找连续的元素
                while (set.contains(current + 1)) {
                    current++;
                    currentLen++;
                }
                // 更新最长连续序列长度
                maxLen = Math.max(maxLen, currentLen);
            }
        }
        return maxLen;
    }

    // 测试方法
    public static void main(String[] args) {
        Solution solution = new Solution();
        int[] num = {1000, 4, 2000, 1, 3, 2};
        System.out.println("最长连续元素序列长度:" + solution.longestConsecutive(num));
    }
}

四、代码解释

  1. 边界处理 :若数组为 null 或长度为 0,直接返回 0。
  2. 初始化哈希集合 :将数组中的所有元素存入 HashSet,利用哈希集合的 contains 方法在 O(1) 时间内判断元素是否存在。
  3. 遍历寻找连续序列起点 :对于集合中的每个元素 n,如果 n-1 不存在于集合中,说明 n 是某连续序列的起点。
  4. 统计连续序列长度 :从起点 n 开始,向后遍历(current + 1),直到元素不存在于集合中,统计该连续序列的长度 currentLen
  5. 更新最大值 :每次统计完一个连续序列的长度后,更新 maxLen 为当前 maxLencurrentLen 中的较大值。

五、复杂度分析

  • 时间复杂度:O(n)。虽然外层有一个循环遍历集合,内层还有一个 while 循环,但每个元素最多被访问两次(一次在判断是否为起点时,一次在向后遍历连续元素时),所以总的时间复杂度是 O(n)。
  • 空间复杂度:O(n)。哈希集合需要存储数组中的所有元素,空间复杂度为 O(n)。
相关推荐
_周游11 小时前
Java8 API 文档搜索引擎_2.索引模块(实现细节)
java·搜索引擎·intellij-idea
鱼跃鹰飞11 小时前
大厂面试真题-说说Kafka消息的不重复和不丢失
java·分布式·kafka
A懿轩A11 小时前
【Maven 构建工具】Maven 依赖管理详解:坐标、传递、作用域与依赖冲突解决(一篇搞懂)
java·linux·maven
2601_9495430111 小时前
Flutter for OpenHarmony垃圾分类指南App实战:资讯详情实现
android·java·flutter
cyforkk13 小时前
12、Java 基础硬核复习:集合框架(数据容器)的核心逻辑与面试考点
java·开发语言·面试
仙俊红13 小时前
LeetCode487周赛T2,删除子数组后的最终元素
数据结构·算法
身如柳絮随风扬18 小时前
Java中的CAS机制详解
java·开发语言
-dzk-19 小时前
【代码随想录】LC 59.螺旋矩阵 II
c++·线性代数·算法·矩阵·模拟
风筝在晴天搁浅19 小时前
hot100 78.子集
java·算法
Jasmine_llq20 小时前
《P4587 [FJOI2016] 神秘数》
算法·倍增思想·稀疏表(st 表)·前缀和数组(解决静态区间和查询·st表核心实现高效预处理和查询·预处理优化(提前计算所需信息·快速io提升大规模数据读写效率