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.
题目要求找到重复的数字,并且时间复杂度要小于n2,不能占用额外的空间,那么暴力搜索方法肯定不能用了。
参考了“https://segmentfault.com/a/1190000003817671”
思路:因为题目告诉了数组长度为n+1,数组中的数的范围是【1:n】,那么如果某一个数x发生了重复,那么遍历这个数组,一定能找到至少x+1个数大于x,那么久可以基于这个结论,运用二分法来解决问题。
public class Solution {
public int findDuplicate(int[] nums) {
int left = 1, right = nums.length;
while (right > left) {
int amount = 0;
int middle = (left + right) / 2;
for (int i = 0; i < nums.length; i++) {
if (nums[i] <= middle) {
amount++;
}
}
if (amount > middle) {
right = middle;
} else {
left = middle + 1;
}
}
return left;
}
}