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.
题目解释:对于一个长度为n+1的数组,其元素的为1~n的范围,求数组中重复出现的元素。
解题思路:由于要求空间复杂度为O(1),而且时间复杂度小于O(n2),因此不能够使用同长度的数组进行标记,或者使用两个循环进行遍历。在这里使用了二分搜索的思路解决。对于1~n个数,先求出中间值mid,然后统计小于中间值mid的个数,因此重复出现的数会使得统计数量大于另一半的区域。
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int n = nums.size()-1;
int low = 1, high = n;
while (low < high) {
int mid = low + (high - low)/2;
int count = 0;
for (int i = 0; i < n+1; i++) {
if (nums[i] <= mid) {
count ++;
}
}
if (count <= mid) {
low = mid +1;
}
else{
high = mid;
}
}
return low;
}
};
对于该算法,其时间复杂度为O(n*log(n))