寻找重复数

解题思路

给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。

    由于所有的数字都是1-n之间,而且只存在一个重复数字,如果没有重复数,

那么刚好就是n个数字,mid = (0+n-1)/2,遍历一遍数组,计算小于等于mid的值的个数,
如果没有重复数,小于等于mid的数字刚好是mid个(1,2,...mid),如果个数大于mid,说明在(1,mid)之间,存在重复的数字;反之,如果个数小于等于mid,说明(mid+1,n)之间,
存在重复的数字;

示例 1:

    arr = [1,3,4,2,2] 
    mid = (0 + 4) / 2 = 2 arr小于等于的2有3个(1,2,2),所以小于mid(2)的1-2中,肯定有重复的值,
   high = mid=2,low = 0
    mid = (0 + 2) / 2 = 1 arr小于等于的1有1个(1),2到2中肯定有重复的值
   low=mid+1=2,hight=2,不满足while条件,所以这个重复值就是2
    
    所以重复的数是 2 

代码

class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        int low  = 0;
        int high = nums.size() -1;
        while(low < high)
        {
            int mid = (low+high) / 2;
            int count = 0;
            for(size_t i=0;i<nums.size();i++)
            {
                if(nums[i] <= mid)
                {
                    count += 1;
                }
            }

            if(count <= mid)
                low = mid+1;
            else
                high = mid;
        }
        return low; 
    }
};

标签: none

添加新评论