1. 287

[find-the-duplicate-number](https://leetcode.com/problems/find-the-duplicate-number/)


2. 算法

  • O(lgn)

* 二分

* 巧妙


3. 代码

* 二分

  • 区间[1,n]之间搜索,求出中点mid
  • 遍历数组,统计所有小于等于mid的数的个数,
  • 如果个数大于mid,则说明重复值在[mid,n]之间,反之,重复值在[1,mid-1]之间
  • 搜索完成,此时low是所求

class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        int low=1,high=nums.size()-1;
        while(low<high){
            int mid=low+(high-low)*0.5;
            int cnt=0;
            for(auto a:nums){
                if(a<=mid)  ++cnt;
            }
            if(cnt<=mid)  low=mid+1;
            else high=mid;
        }

        return low;
    }
};

results matching ""

    No results matching ""