题目:
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.
解析:
没做出来,用2分法,当小于等于n/2的数字个数大于n/2,说明多余的数字在小的部分,否则在大的部分,时间复杂度是O(nlogn)
1 class Solution { 2 public: 3 int findDuplicate(vector<int>& nums) { 4 int n=nums.size()-1; 5 int low=1; 6 int high=n; 7 int mid; 8 while(low<high){ 9 mid=(low+high)/2; 10 int count=0; 11 for(int num:nums){ 12 if(num<=mid) count++; 13 } 14 if(count>mid) high=mid; 15 else low=mid+1; 16 } 17 return low; 18 } 19 };