剑指offer 14. 不修改数组找出重复的数字 (二分)

题面

在这里插入图片描述

题解

  1. 如果可以使用额外的数组,我们可以新开一个数组统计每个数出现的个数即可
  1. 这题我们可以用二分来做,因为n+1个在1-n的数一定有两个数是重复的,那么我们每次以中间值二分,那么左右一定有一个区间的数的个数是大于它的l-mid+1的,这个大于的就是重复的数

代码

class Solution {
    
    
public:
    int duplicateInArray(vector<int>& nums) {
    
    
        int l=1,r=nums.size()-1;
        while(l<r){
    
    
            int mid=l+r>>1;
            int s=0;
            for(auto x:nums) {
    
    
                if(x>=l&&x<=mid){
    
    
                    s++;
                }
            }
            if(s>mid-l+ 1) r = mid;
            else l = mid + 1;
        }
        return l;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_44791484/article/details/114631926