给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n)
的算法解决此问题。
128. 最长连续序列 - 力扣(LeetCode)
思路:
利用哈希表查找效率O(1)。哈希表中保存不重复的数字作为键,值为null,之后遍历键,如果有连续小于该键的,那么向后遍历到最小的那个键,之后保存长度。
结果为所有连续序列长度最大值。
示例:
筛选起始数字:
对于 [4,3,1,2],其实只需要以1作为起始数字查一次就行,2、3、4均不需要再作为起始数字进行查询判断,因为4之前有3,查3肯定会查到4,同理,3之前有2,2之前有1,所以作为起始数字的条件是不存在 【该数字减一的数字】;
通过哈希表查找起始数字:
如果通过数组查找起始数字,对于 [4,3,3,3] 的包括重复元素的数组,筛选起始数字后,4不考虑,可是数组的3重复了3次,就会查询3次,但3这个元素其实只需要查询一次即可,所以需要去重,那么就可以利用哈希表的键值唯一特点,数组[4,3,3,3]建立的哈希表键值只有[4,3],筛选掉4之后,只剩下元素3,不会被元素重复浪费时间;
复杂度:
时间复杂度:O(n)
空间复杂度:O(n)
public class Solution {public int LongestConsecutive(int[] nums) {int len = nums.Length;if(len == 0)return 0;Hashtable ht = new Hashtable();for(int i = 0; i < nums.Length; i++){if(!ht.ContainsKey(nums[i])){ht.Add(nums[i],null);}}int resLength = 0;foreach(int num in ht.Keys){if(ht.ContainsKey(num - 1))continue;int curLength = 0;int curNum = num;while(ht.ContainsKey(curNum++))curLength++;resLength = Math.Max(curLength,resLength);}return resLength;}
}