最长连续序列
继续给大家带来每日一题
题目描述:
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
题目示例:
这道题目其实也不难,给大家分享的目的也只想分享一个思路,对于这种找连续的型的题目,起点是比较难确定的,如题目给的case:
nums = [100,4,200,1,3,2]
我们遍历到100的时候,我们要找下一个元素,但是下一个元素有可能是100+1,也有可能是100-1,这个时候就很难确定我们的走向是如何,现在我们有两种思路,但其本质都是确定从起点开始还是从终点开始
- 1.对数组排序,这样我们从头到尾去遍历,只需要确定相邻元素的作差是否为1就可以判断是否是连续的,但是无论用什么排序算法其时间复杂度均会大于0(n)
- 2.直接判断当前元素是否为起点
- 100,前一个元素为99,数组无99,所以100是起点,100的下一个元素101,数组没有,所以以100为起点的连续数组长度是1
- 4,前一个元素:3,数组有3,所以4不是起点,直接跳过
- 200.前一个元素:199,数组无199,所以200是起点,200的下一个元素201,数组没有,所以以100为起点的连续数组长度是1
- 1,前一个元素:0,数组无0,所以1是起点,1的下一个元素2,数组有,2的下一个元素3,数组有,3的下一个元素4,数组也有,4的下一个元素5,数组没有,所以以1为起点的连续数组长度是4
- 3,前一个元素:2,数组有2,所以3不是起点,直接跳过
- 2,前一个元素:1,数组有1,所以2不是起点,直接跳过
所以最大长度为4,知道了这个逻辑我们代码就很好实现了
public static int longestConsecutive(int[] nums) {int max = 0;int n = nums.length;Set<Integer> set = new HashSet<>(n);for (int i : nums) {set.add(i);}for (int i : set) {if (!set.contains(i - 1)) {//说明是开头,依此去找符合+1的值int len = 1;int cuNum = i;while (set.contains(cuNum + 1)) {len++;cuNum++;}max = Math.max(len, max);}}return max;}