题目:
给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n)
的算法解决此问题。
题解:
首先将所有元素存储在一个哈希表中,想象这些数字排好序放在数组上,然后每次从一段的头部进入,记录这一段的长度,在每一次进去算得的长度中取最大值。
判断头部:查找不到当前元素x的前一个(x-1)。
进入后不断向后移动:不断查找当前元素加一。
将数组放入哈希表中时间复杂度是O(n),判断每一个数是否是起点时间复杂度是O(n),哈希表的查找时间总的时间复杂度是O(n)的,总的加起来时间复杂度为O(n);
int search(vector<int>& nums, int target) {
int l=0,r=nums.size()-1,mid;
while(l<=r){
mid=(l+r)>>1;
if(nums[mid]==target){
return mid;
}else if(nums[mid]>target)r=mid-1;
else l=mid+1;
}
return -1;
}