一.题目介绍
1.题目来源
链接:LeetCode
2.题目
给定一个未排序的整数数组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
二.具体实现
1.实现思路
题目明确要求了要实现时间复杂度为 O(n)
的算法,那可以先对数组进行排序,然后计算其是否是连续的,是连续就统计其次数,在连续中如果中间有重复值跳过,没有就继续统计,如果连续被打断要记录被打断的位置,最后返回长度。
2.实现代码
1)自己的实现方式
public int longestConsecutive(int[] nums) { int len = nums.length; if(len == 0) return 0; //排序 Arrays.sort(nums); int res = 0; int count = 1; for(int i=1;i<len;i++){ //是连续统计+1 if(nums[i]-nums[i-1]==1) count++; //是重复则跳过 else if(nums[i] == nums[i-1]) continue; //连续被打断,判断是原来记录连续长还是新连续长 else{ res = Math.max(res,count); count = 1; } } return Math.max(res,count); } 复制代码
2)题友的实现方式
动态规划:使用哈希表记录连续区间长度,遍历nums数组中的所有数字num,当num是第一次出现时: (1)分别获取到左相邻数字num-1的连续区间长度left和右相邻数字num+1的连续区间长度right; (2)计算得到当前的区间长度为curLen=left+right+1curLen=left+right+1; (3)更新最长区间长度ans以及左右边界的区间长度。 实现代码:
3.运行结果
三.题后思考
连续序列系列的题目也很多,我大概看了一下,解决方案里动态规划用得很多还有就是借助哈希表去实现,只能说题友们的思路真的很好,还有就是也应该尝试一下写出最优解。