题目:

给定一个未排序的整数数组 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. 在更新数据的时候,显示一个软件源里面没有Release文件

  2. 【算法】C和Python实现快速排序-三数中值划分选择主元(非随机)

    一.快排基础 1.1 快排的流程 将数组A进行快速排序的基本步骤-quick_sort(A): 递归基础情况:如果A中的元素个数是1或0,则返回. 选取主元:取A中的任意一个元素v,作为主元(pivo ...

  3. day04-应用线程03

    JavaGUI-坦克大战04 7.线程的应用03 7.3坦克大战4.0版 7.3.4功能3:敌方坦克自由移动 功能3:让敌人的坦克也可以自由随机地上下左右移动 思路: 因为要求敌人的坦克自由移动,因此 ...

  4. 安装libevent

    1.在libevent官网(http://libevent.org/)上下载压缩包(我下载的是libevent-2.1.8-stable.tar.gz) 2.解压压缩包:tar -zxvf libev ...

  5. FFmpeg介绍与编译

    目录 FFmpeg FFmpeg核心模块 FFmpeg编译 FFmpeg FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制 ...

  6. 纯前端实现 PNG 图片压缩 | UPNG.js

    在线 Demo 体验地址 →: https://demos.sugarat.top/pages/png-compress/ 前言 最近在迭代自己的 图床 应用,由于使用时间的累计,存储空间占用越来越大 ...

  7. 元宇宙是VR虚拟现实的未来吗?

    从科幻小说到商业现实 自从 Facebook年更名为 Meta 以来,关于元宇宙的热议不断,人们对虚拟世界的兴趣也重新燃起,因为尽管虚拟现实 (VR) 的概念由来已久,但该技术现在才开始真正得以应用. ...

  8. 3DCAT实时云渲染助力广府庙会元宇宙焕新亮相,开启线上奇趣之旅!

    超 400 万人次打卡,商圈营业额逾 3.6 亿元,2023 年广府庙会于2023年2月11日圆满落幕. 活动期间,佳境美如画,融合VR.AR.虚拟直播等技术的广府庙会元宇宙焕新亮相,群众只需点击一个 ...

  9. HTML(表格、列表、表单)

    表格 表格的主要作用 1.表格主要用于显示.展示数据,因为它可以让数据显示的非常的规整,可读性非常好.特别是后台展示数据的时候,能够熟练运用表格就显得很重要.一个清爽简约的表格能够把繁杂的数据表现得很 ...

  10. 说说Vue 3.0中Treeshaking特性?举例说明一下?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.是什么 Tree shaking 是一种通过清除多余代码方式来优化项目打包体积的技术,专业术语叫 Dead code eliminat ...