已解决
算法升级之路(五)
来自网友在路上 146846提问 提问时间:2023-10-31 19:35:32阅读次数: 46
最佳答案 问答题库468位专家为你答疑解惑
128. 最长连续序列、
难度:中等
给定一个未排序的整数数组 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
解题思路:
最简单的方法就是排序,去重。然后一个个的计算,比较。得出最大的连续长度。可惜的是时间复杂度会超。
只要用了排序就会超,因为sort方法的时间复杂度是O(nlogn),大于O(n).
那么除了进行排序还有可以按照大小遍历的方法吗,集合就可以。
我们用HashSet存储数组,利用set集合来去重。
那么怎么按照大小遍历呢。
首先遍历集合,如果当前元素m,在数组中不存在m-1,说明这个m是一段连续序列的开始。
然后当集合中存在m+1时,连续序列的长度+1,m也+1直到集合中不存在m+1,计算连续序列的长度与当前连续序列的长度,保存最大值,继续循环,循环结束,返回保存的最大值即可。
代码实现
public int longestConsecutive(int[] nums) {Set<Integer> num_set = new HashSet<Integer>();for (int num : nums) {num_set.add(num);}int longestStreak = 0;for (int num : num_set) {if (!num_set.contains(num - 1)) {int currentNum = num;int currentStreak = 1;while (num_set.contains(currentNum + 1)) {currentNum += 1;currentStreak += 1;}longestStreak = Math.max(longestStreak, currentStreak);}}return longestStreak;}
查看全文
99%的人还看了
相似问题
- 【Django-DRF用法】多年积累md笔记,第3篇:Django-DRF的序列化和反序列化详解
- 【Java 进阶篇】JavaScript JSON 语法入门:轻松理解数据的序列化和反序列化
- 【python学习】基础篇-常用模块-pickle模块:序列化和反序列化
- ZC序列理论学习及仿真
- 时间序列预测实战(十七)PyTorch实现LSTM-GRU模型长期预测并可视化结果(附代码+数据集+详细讲解)
- 代码随想录算法训练营第二十九天| 491 递增子序列 46 全排列
- 最长递增子序列
- 深入解析序列模型:全面阐释 RNN、LSTM 与 Seq2Seq 的秘密
- c#Nettonsoft.net库常用的方法json序列化反序列化
- 基于C#实现最长公共子序列
猜你感兴趣
版权申明
本文"算法升级之路(五)":http://eshow365.cn/6-28928-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: neutron服务启动源码分析(三)
- 下一篇: 【shell】 for i