https://leetcode.com/problems/find-the-duplicate-number/
解法一:二分查找。要找的数就在1~n里面,重复数字值小于等于mid的话,那么小于等于mid的数的总数一定大于mid,因而end左移;否则beg右移。
public class Solution {
public int findDuplicate(int[] nums) {
if (nums == null || nums.length == 0) {
return -1;
}
int beg = 1;
int end = nums.length - 1;
while (beg < end) {
int mid = beg + (end - beg) / 2;
int count = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] <= mid) {
count++;
}
}
if (count > mid) {
end = mid;
} else {
beg = mid + 1;
}
}
return beg;
}
}
解法二:找环双指针法。i = nums[i]是一种相当于list移动的表现形式。特别是在数组内元素限定大小的情况下要有意识往这上面靠。
public class Solution {
public int findDuplicate(int[] nums) {
if (nums == null || nums.length == 0) {
return -1;
}
int slow = 0;
int fast = 0;
do {
slow = nums[slow];
fast = nums[nums[fast]];
} while (slow != fast);
fast = 0;
while (slow != fast) {
slow = nums[slow];
fast = nums[fast];
}
return slow;
}
}