http://www.lintcode.com/zh-cn/problem/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.
注意事项
- 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(n^2).
- There is only one duplicate number in the array, but it could be repeated more than once.
样例
Given nums
= [5,5,4,3,2,1]
return 5
Given nums
= [5,4,4,3,2,1]
return 4
public class Solution {
/**
* @param nums an array containing n + 1 integers which is between 1 and n
* @return the duplicate one
*/
//TC=O(nlgn)
public int findDuplicate(int[] nums) {
// Write your code here
if(nums==null || nums.length==0) return -1;
int n = nums.length;
int s=1, e=n-1;
while(s<=e){
int m = (s+e)/2;
int lowerCount=0, higerCount=0, euqalCount=0;
for(int i=0; i<n; i++){
if(m==nums[i]){
euqalCount++;
if(euqalCount>1)
return m;
}else if(m<nums[i]){
higerCount++;//比m大的数的计数
}else{
lowerCount++;//比m小的数的计数
}
}
if(higerCount>(n-1-m))//由于是n+1个数,多出的一个可定是重复的数
s=m+1;
else if(lowerCount>(m-1))
e=m-1;
}
return -1;
}
}