问题描述:
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、把nums排序,依次检查,如果位置 i 和 i+1 位置的元素相同,就是重复元素;
2、用二分查找,因为是把n个值放在n+1个位置中,所以每次计数有c个大于mid的值,如果c>mid 说明重复值在mid-high之间,返回说明重复值在low-mid之间,重复循环mid=(low+high)/2。
代码:
solution1:
int findDuplicate1(vector<int>& nums) {
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size() - 1; i++) {
if (nums[i] == nums[i + 1])
return nums[i];
}
}
int findDuplicate2(vector<int>& nums) {
int lo = 1, hi = nums.size() - 1;
while (lo < hi) {
int mid = (hi + lo) / 2;
int c = 0;
for (int i : nums)
if (i <= mid)
c += 1;
if (c > mid)
hi = mid;
else
lo = mid + 1;
}
return lo;
}