287. 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.
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的数。只有一个是重复的。那么可以根据数量来判断。比如位置i = 5;那应该有
0 1 2 3 4 5
1 2 3 4 5
小于等于i的数为i个。如果比i个多,那就说明重复的在左边,否则就说明重复的在右边。
public class Solution {
public int findDuplicate(int[] nums) {
int len = nums.length;
int left = 0;
int right = len-1;
while(left<=right){//11234
int mid = left+(right-left)/2;
int count = helper(nums,mid);
if(count>=mid+1){
right = mid-1;
}else{
left = mid+1;
}
}
return left;
}
public int helper(int[] ns,int mid){
int count = 0;
for(int i = 0;i<ns.length;i++){
if(ns[i]<=mid)count++;
}
return count;
}
}
time = 5ms