原题描述
Find the Duplicate Number
Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicate number must exist. Assume that there is only one duplicate number, find the duplicate one.
Note:
You must not modify the array (assume the array is read only).
You must use only constant, O(1) extra space.
Your runtime complexity should be less than O(n2).
There is only one duplicate number in the array, but it could be repeated more than once.
分析
提示使用二分搜索,考虑到元素取值限制在1~n内,可以先取n/2,并求出比n/2小的元素个数,如果此个数大于n/2则说明1~n/2中必定有重复的数,反正则在n/2~n中。接下来重复上述步骤即可。
此种方法用迭代很易实现,迭代函数变量中一个记录起始数字begin一个记录结束数字end,需注意的是迭代结束条件。一种情况是一直迭代到begin与end相等,则结果就是这个值;一种情况是begin不会等于end但此时(begin+end)/2与begin相等,则结果就是end。
代码示例
class Solution {
public:
int recurse(vector<int>& nums, int begin, int end)
{
if (begin == end)
return begin;
int n = (begin + end) / 2;
int count = 0;
for (int i = 0; i < nums.size(); i++)
{
if (nums[i] <= n)
{
count++;
}
}
if (count > n)
return recurse(nums, begin, n);
else if (begin == n)
return end;
else
return recurse(nums, n, end);
}
int findDuplicate(vector<int>& nums)
{
return recurse(nums, 1, nums.size() - 1);
}
};