剑指【不修改数组查找重复数字】

给定一个长度为n+1的数组 nums,数组中所有数都在1-n范围内,其中n>=1;

查找数组中任意一个重复的数;

将数字范围1-n作为二分查找的左右区间,l=1,r=n;mid=(l+r)/2;如果数值落在l-mid上的数的个数比左区间的长度大,则说明左区间有重复数字,否则右区间有重复数字;

int duplicate(vector<int>& nums)
{
    int l=1,r=nums.size()-1;
    while(l<r)
    {
        int mid=l+r>>1;//[l,mid][mid+1,r]
        int s=0;//计数:计算落入左区间的数字个数
        for(auto x: nums) 
            s+= x>=1 && x<=mid;
        if(s> mid - l +1) r=mid;
        else l=mid+1;
    }
    return r;
}

猜你喜欢

转载自blog.csdn.net/weixin_41469381/article/details/89430915
今日推荐