描述

给定无序数组arr,返回其中最长的连续序列的长度(要求值连续,位置可以不连续,例如 3,4,5,6为连续的自然数)
数据范围: 1 \le n \le 10^51n105,数组中的值满足 1\le val \le 10^81val108
要求:空间复杂度 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开始。
这样做的时间复杂度就是O(n),空间复杂度就是O(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;
    }
};