描述
给定无序数组arr,返回其中最长的连续序列的长度(要求值连续,位置可以不连续,例如 3,4,5,6为连续的自然数)
数据范围: 1 \le n \le 10^51≤n≤105,数组中的值满足 1\le val \le 10^81≤val≤108
要求:空间复杂度 O(n)O(n),时间复杂度 O(nlogn)O(nlogn)
需要寻找最长连续序列的长度,就需要先排序,然后再对排好序的数组进行操作。
因为数组是可以有重复值的,所以我们就需要对数组做如下操作:
定义一个num,记录当前最长连续子序列,max表示整个数组最长的。
1: 如果arr[i-1]==arr[i],直接++i;
2.:如果arr[i-1]==arr[i]-1,++num;
3: 否则,对max和num进行比较,找到最大的赋值给max,num重新赋值。
4:遍历完整个数组在对max和num进行比较一次,因为可能碰到最后一次统计num的时候,一直满足条件,
这样max就没有对最后一次num进行比较。
说明:为什么是arr[i-1}和arr[i]做比较,因为i一直是变的,如果是arr[i]和arr[i+1]比较的时候,
在上面第一步就会出现问题,所以i就要从1开始。
class Solution { public: /** * max increasing subsequence * @param arr int整型vector the array * @return int整型 */ int MLS(vector<int>& arr) { // write code here if(arr.size()<=1) return int(arr.size()); sort(arr.begin(),arr.end()); int max=1; int num=1; for(vector<int>::size_type i=1;i<arr.size();) { if(arr[i-1]==arr[i]-1) ++num,++i; else if(arr[i-1]==arr[i]){ while(arr[i-1]==arr[i]&&i<arr.size()) ++i; } else max=(max>num)?max:num,num=1,++i; } max=(max>num)?max:num; return max; } };