Description:
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.
Solution:
The solution is very tricky, but we can think of some trivial methods at first.
1. Just use an array with length n+1, and calculate the showing times for each number.
But it is required that extra space is O(1), so we need to choose another solution.
We can find a very interesting property of this array: if no duplicates with number n, then the numbers equal or below n is n. We can put this into a function. So if we call this function, then a binary search can work.
import java.io.*;
import java.util.*;
public class Solution {
public int count(int[] nums, int bound) {
int n = 0;
for (int i = 0; i < nums.length; i++)
if (nums[i] <= bound)
n++;
return n;
}
public int findDuplicate(int[] nums) {
int n = nums.length;
int l = 1, r = nums.length;
int mid, c;
while (l <= r) {
mid = (l + r) / 2;
c = count(nums, mid);
if (c > mid)
r = mid - 1;
else
l = mid + 1;
}
return l;
}
}