题目:

给定一个未排序的整数数组 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 <= 105
-109 <= nums[i] <= 109

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-consecutive-sequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

一、哈希集合

先将数组中的数放入哈希集合中(这时已经去掉重复元素了),遍历去重后的所有数字,当num-1不存在时,才开始向后遍历num+1,num+2,num+3......【

如果num-1已经在数组中的话,那么num-1会进行相应的+1遍历,遍历到num,而且从num-1开始的+1遍历必定比从num开始的+1遍历得到的序列长度更长。因此,我们便可将在一个连续序列中的元素进行删减,让其只在最小的元素才开始+1遍历。比如,现有元素[1,2,4,3,5],当2,3,4,5发现均有比自己小1的元素存在,那么它们就不会开始+1遍历,这样每个元素就只被遍历一次。

】这样不断更新最大连续长度,最后返回最大连续长度即可。

java代码:

 1 class Solution {
2 public int longestConsecutive(int[] nums) {
3 HashSet<Integer> hashset = new HashSet<>();
4 for(int num : nums){
5 hashset.add(num);
6 }
7 int res = 0;
8 for(int num : hashset){
9 int cur = num;
10 //在前一个数不存在的情况下再去判断后续数
11 if(!hashset.contains(cur - 1)){
12 while(hashset.contains(cur + 1)){
13 cur++;
14 }
15 }
16 res = Math.max(res, cur - num + 1);
17 }
18 return res;
19 }
20 }

 python3代码:

 1 class Solution:
2 def longestConsecutive(self, nums: List[int]) -> int:
3 set1 = set(nums)
4 res = 0
5 for num in set1:
6 cur = num
7 if cur - 1 not in set1:
8 while cur + 1 in set1:
9 cur += 1
10
11 res = max(res, cur - num + 1)
12 return res

二、哈希表记录右边界

建立一个哈希表,记录每个元素num能够连续到达的右边界,初始化num的右边界均为自己,每次while循环中把遍历到的right键值对删除,只通过最后一步put保留这次循环中最小元素到最大元素的键值对。这样后续元素才会因为map中没有相应的key提前退出循环,从而达到减少遍历次数的效果。

java代码:

 1 class Solution {
2 public int longestConsecutive(int[] nums) {
3 HashMap<Integer,Integer> map = new HashMap<>();
4 //key表示num,value表示num最远到达的连续右边界
5 //初始化num的右边界均为自己
6 for(int num : nums){
7 map.put(num, num);
8 }
9 int res = 0;
10 for(int num : nums){
11 if(map.containsKey(num)){
12 int right = map.get(num);
13 //遍历得到最远的右边界
14 while(map.containsKey(right + 1)){
15 //移除当前键值对
16 map.remove(right);
17 right = map.get(right + 1);
18 }
19 //保存最长的连续元素的键值对
20 map.put(num , right);
21 res = Math.max(res, right - num + 1);
22 }
23 }
24 return res;
25 }
26 }

 小知识:

remove() 方法用于删除hashMap 中指定键 key 对应的键值对(key-value)

力扣128(java&python)-最长连续序列(中等)的更多相关文章

  1. Java实现 LeetCode 128 最长连续序列

    128. 最长连续序列 给定一个未排序的整数数组,找出最长连续序列的长度. 要求算法的时间复杂度为 O(n). 示例: 输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连 ...

  2. leetcode.哈希表.128最长连续序列-Java

    1. 具体题目 给定一个未排序的整数数组,找出最长连续序列的长度.要求算法的时间复杂度为 O(n). 示例: 输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 ...

  3. 图解leetcode —— 128. 最长连续序列

    前言: 每道题附带动态示意图,提供java.python两种语言答案,力求提供leetcode最优解. 描述: 给定一个未排序的整数数组,找出最长连续序列的长度. 要求算法的时间复杂度为 O(n). ...

  4. [LeetCode] 128. Longest Consecutive Sequence 求最长连续序列

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...

  5. LeetCode--Longest Consecutive Sequence(最长连续序列) Python

    题目描述: Longest Consecutive Sequence(最长连续序列) 中文: 给定一个未排序的整数数组,找出最长连续序列的长度. 要求算法的时间复杂度为 O(n). 英文: Given ...

  6. 128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列

    给定一个未排序的整数数组,找出最长连续序列的长度.例如,给出 [100, 4, 200, 1, 3, 2],这个最长的连续序列是 [1, 2, 3, 4].返回所求长度: 4.要求你的算法复杂度为 O ...

  7. [leetcode]128. Longest Consecutive Sequence最长连续序列

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence. Y ...

  8. 【LeetCode】128. 最长连续序列

    题目 给定一个未排序的整数数组,找出最长连续序列的长度. 要求算法的时间复杂度为O(n). 示例: 输入:[100, 4, 200, 1, 3, 2] 输出:4 解释:最长连续序列是[1, 2, 3, ...

  9. LeetCode 128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence.Fo ...

  10. LeetCode 128. 最长连续序列(Longest Consecutive Sequence)

    题目描述 给定一个未排序的整数数组,找出最长连续序列的长度. 要求算法的时间复杂度为 O(n). 示例: 输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 [1 ...

随机推荐

  1. 解决 Steam for Linux 部分 Valve 游戏中文显示问题/军团要塞2的字体显示问题

    解决 Steam for Linux 部分 Valve 游戏中文显示问题 发表于 Apr 7th 2019 | 分类于 Keep Digging Steam for Linux 上有许多好玩的免费游戏 ...

  2. day01-SpringBoot基本介绍

    SpringBoot基本介绍 1.SpringBoot是什么? 官网地址:https://spring.io/projects/spring-boot 学习文档:https://docs.spring ...

  3. vscode自动生成头文件

    Ctrl Shift P 输入:snipp,选配置用户代码片段,新建全局代码片段文件,修改下列模板: { // Place your 全局 snippets here. Each snippet is ...

  4. WPF线程模型

    1. 渲染系统概述 WPF 采用保留模式渲染系统 (Retained Mode Rendering System),该系统可分为 UI 线程和复合线程两个主要部分,两者协作完成 WPF 应用程序的渲染 ...

  5. Java Spring Redis 如何向Set中添加List?

    调用list.toArray方法将list转成数组,再使用add方法参数传入数组,即可批量添加. redisTemplate.opsForSet().add(key,collect.toArray(n ...

  6. TP6框架--EasyAdmin学习笔记:列表调用搜索,开发常见问题记录

    这是我写的学习EasyAdmin的第五章,这一章我给大家分享下列表调用搜索的相关知识,并记录说明下开发时碰到的常见问题 首先说明下如何在页面中调用layui的搜索,效果如下: 代码如下: define ...

  7. [Java]Socket套接字(网络编程入门)

    [版权声明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/129907893 出自[进步* ...

  8. Linux基础操作一

    开启Linux操作系统,要求以root用户登录GNOME图形界面,语言支持选择为汉语 开启虚拟机→Username:root→Password:"(注册时所创建的密码,比如"123 ...

  9. Nancy支持跨域请求

    public class NancyBootstrapper : DefaultNancyBootstrapper { /// <summary> /// nancy配置 /// < ...

  10. KingbaseES 实现 MYSQL 的 delete limit 写法

    使用MySQL的用户可能会比较熟悉这样的用法,更新或删除时可以指定限制更新或删除多少条记录. update tl set xxx=xxx where xxx limit 10; delete from ...