当前位置: 首页 > news >正文

leetcode hot100【LeetCode 128. 最长连续序列】java实现

LeetCode 128. 最长连续序列

题目描述

给定一个未排序的整数数组 nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

示例 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

Java 实现解法

方法:使用 HashSet
class Solution {public int longestConsecutive(int[] nums) {Set<Integer> set = new HashSet<>();for (int num : nums) {set.add(num);}int maxLength = 0;for (int num : set) {// 只处理序列的起点if (!set.contains(num - 1)) {int currentNum = num;int currentStreak = 1;// 查找连续序列的长度while (set.contains(currentNum + 1)) {currentNum++;currentStreak++;}maxLength = Math.max(maxLength, currentStreak);}}return maxLength;}
}

解题思路

  1. 去重:首先,我们将所有数组元素添加到一个 HashSet 中,以去除重复项并允许 O(1) 时间复杂度的查找。
  2. 寻找序列起点:我们遍历 HashSet,对于每个数字,检查 num - 1 是否不在 HashSet 中。如果不在,这意味着 num 是一个连续序列的起点。
  3. 扩展序列:对于每个序列的起点,我们尝试扩展序列,通过检查 num + 1 是否在 HashSet 中,如果在,则增加序列长度。
  4. 更新最长序列:在每次扩展序列后,我们更新记录的最长序列长度。

时间复杂度

  • 时间复杂度:O(n),其中 n 是数组 nums 的长度。这是因为我们对数组进行了一次遍历,并且对于每个元素,我们在 HashSet 中进行了最多两次查找操作(一次向前,一次向后)。

空间复杂度

  • 空间复杂度:O(n),用于存储 HashSet

这种方法利用了 HashSet 的快速查找特性,有效地在线性时间内解决了问题。

注:题目来源leetcode网站


http://www.mrgr.cn/news/59046.html

相关文章:

  • 首发CSP-J2题解
  • 【已解决】编译Linux内核报错multiple definition of yylloc
  • 大模型训练、微调数据集
  • linux网络编程6——基于UDP的可靠传输协议KCP/QUIC
  • Minio文件服务器:安装
  • [LeetCode] 77. 组合
  • shodan1,shodan简介和kali下的使用
  • 【Linux】线程池详解及其基本架构与单例模式实现
  • [LeetCode] 494. 目标和
  • 【动态规划】【简单多状态dp问题】买卖股票相关问题(冷冻期、手续费、限制次数)
  • 基于SSM农业信息管理系统的设计
  • python曲线拟合通用代码
  • 数据结构(java)——数组的构建和插入
  • 【网络安全】一文讲清Zero Trust(零信任)安全
  • 【Python爬虫+数据分析】详细教学知网文献基本信息爬取方式(附详细教程+完整代码)
  • ctfshow的sql注入解题思路171-211
  • 文言编程:古老文字与现代编程的融合
  • 禾川SV-X2E A伺服驱动器参数设置——脉冲型
  • Gateway 统一网关
  • 【论文阅读】ESRGAN