题目如下:
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.
解答如下:
因为说要O(1) 额外空间所以还挺麻烦的。具体思路是仿照二分法,如果比mid小的数多于n/2个,那重复数一定在前半部分,否则在后半部分。代码:
class Solution {
public int findDuplicate(int[] nums) {
int min=0;int max=nums.length-1;
while(min<=max){
int mid=(min+max)/2;
int count=0;
for(int i=0;i<nums.length;i++){
if(nums[i]<=mid) count++;
}
if(count>mid) max=mid-1;
else min=mid+1;
}
return min;
}
}