问题:给定一个无重复元素的整数数组nums,请你找出其中没有出现的最小的正整数。
要求: 空间复杂度 O(1),时间复杂度 O(n)
进阶:空间复杂度O(1),时间复杂度 O(logn)
数据范围:-231<=nums[i]<=231-1,0<=len(nums)<=5*105
问题分析:因为整个数组是无序且无重复的,那么第一步需要做的就是排序。排好序后,因为要找的是
缺失的第一个正整数,所以需要把所有<=0的数筛除出去。这一步可以采用二分法,过程可以分为两步:
1、令l=1,只要nums[l]<0, l*=2,这样就能最快的找到大于0的数的位置。
2、那么因为上一步的操作,第一个大于0的整数肯定在l~2*l区间内。采用二分法的思想,找到第一个大
    于0的整数位置。具体过程看下面代码都有注释
接下来就是在 l (通过上面的步骤已经确定 l 所在的位置是第一个大于0的整数)到 r(r=nums.size()-1)
区间寻找第一个缺失的整数。具体过程看代码,有详细的注释
复杂度分析:
时间复杂度O(logn):寻找第一个大于0的数O(logn),下面确定缺失的数所在的位置也是O(logn)
空间复杂度O(1):只定义了常数个变量
class Solution {
public:
    int minNumberDisappeared(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int l=0,r,mid;
        //获取第一个大于0的整数位置
        if(nums[0]<0) {
            l=1;
            while(nums[l]<0) l*=2;//循环找到大于0的位置
            r=l,l/=2;
            while(l<=r&&nums[l]<=0) {//在l~2*l区间内找到第一个大于0的整数
                mid=l+(r-l)/2;
                if(nums[mid]>0) r=mid;
                else l=mid+1;
            }
        }
        if(nums[0]==0) l=1;//如果nums[0]=0,说明下一个肯定大于0
        if(nums[l]!=1) return 1;//如果第一个大于零的整数不是1,就返回1
        r=nums.size()-1;
        if(nums[r]==r-l+1) return nums[r]+1;//说明前面都是连续的,直接返回最后一个数+1
        int tmp=l;//保存第一个大于0也就是1所在的位置
        while(r-l>1) {//最终结果就是r和l中间的数字
            mid=l+(r-l)/2;
            if(nums[mid]==mid-tmp+1) l=mid;//不能是mid+1,因为可能num[mid]下一个就是缺失的整数
            else r=mid;//同上,可能nums[mid]上一个就是缺失的整数
        }
        return nums[l]+1;
    }
};