当前位置:首页 > 编程笔记 > 正文
已解决

算法升级之路(五)

来自网友在路上 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%的人还看了

猜你感兴趣

版权申明

本文"算法升级之路(五)":http://eshow365.cn/6-28928-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!