题目描述(剑指Offer3)
在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。
示例
Input:
{2, 3, 1, 0, 2, 5}
Output:
2
首先放一个时间复杂度 O(N),空间复杂度 O(1)的方法,因为数字范围是[0,n-1],就把数字放在它该去的地方,若某个地方已经存在了这个数字,则它是重复的。。
public boolean duplicate(int[] nums, int length, int[] duplication) {
if (nums == null || length <= 0)
return false;
for (int i = 0; i < length; i++) {
while (nums[i] != i) {
if (nums[i] == nums[nums[i]]) {
duplication[0] = nums[i];
return true;
}
swap(nums, i, nums[i]);
}
}
return false;
}
private void swap(int[] nums, int i, int j) {
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
这个解法应该是正确的,但是在牛客上并不能百分百通过,好像牛客网上有个用例默认是找到第一个重复的数字(坑)。
所以。。。还是笨方法
public boolean duplicate(int numbers[],int length,int [] duplication) {
if (numbers == null && length <= 0){
return false;
}
for (int i = 0; i < length; i++) {
for (int j = i+1; j <length ; j++) {
if (numbers[i] == numbers[j]){
duplication[0] = numbers[i];
return true;
}
}
}
return false;
}