题目
给定一个未排序的整数数组
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
思路
第一思路是:先将他们排序,之后找到最长的一段连续数字之后返回长度即可。emmm看着还是比较简单
实际书写遇到的问题
他会有多个数相同的情况,这个一般是会影响我们判断长度的就需要去重,自然就是用Set集合
之后怎么将Set集合转化为数组呢?
最笨的方式一个一个取出来,然后依次装入数组排序。不好,空间利用率低。
苦思冥想emmmm..............
可以直接在原来 的num中判断。当出现重复的数时直接跳过即可。判重还是用set.add(),他会返回一个boolean显示是否加入成功。
算法流程图
代码实现
class Solution {public int longestConsecutive(int[] nums) {if(nums.length == 0) {return 0;}// 用于判定元素是否重复Set<Integer> set = new HashSet<>();int length = 1;int maxLength = 1;// 排序Arrays.sort(nums);for(int i =1; i< nums.length; i++) {// 当元素存在时, 保持length不变。 if( ! set.add(nums[i])) {continue;}// 连续的元素: 翻译下:就是nums[i-1] + 1 = nums[i]if(nums[i-1] + 1 == nums[i]) {length ++;// 当出现多串连续元素时, 取最大length: 。maxLength = Math.max(length, maxLength);}else{length = 1;}}return maxLength;}
}
执行结果:
时间23ms, 空间63.37MB