描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任一一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1
示例1
输入: [2,3,1,0,2,5,3]
返回值: 2
说明: 2或3都是对的
思路
本题可以依赖于外部空间,建立hash数组记录次数
但是由于题意中:在一个长度为n的数组里的所有数字都在0到n-1的范围内,可以进行原数组hash,减少hash数组的额外空间
复杂度分析:
时间复杂度:O(n),最坏情形没有重复数字,那么会以O(n)的次数两两交换直至所有numbers[i]与i对应起来。
空间复杂度:O(1),在原数组上进行操作,未使用其他空间
代码
import java.util.*;
public class Solution {
public int duplicate (int[] numbers) {
//在一个长度为n的数组里的所有数字都在0到n-1的范围内
//原地hash 修改原数组,减少内存
for (int i=0; i<numbers.length; ) {
if (i == numbers[i]) {
++i;
} else {
if (numbers[numbers[i]] == numbers[i]) {
return numbers[i];
} else {
//交换numbers[numbers[i]]与numbers[i]的位置
swap(numbers, i, numbers[i]);
}
}
}
return -1;
}
public void swap(int[] numbers, int left, int right) {
int temp = numbers[left];
numbers[left] = numbers[right];
numbers[right] = temp;
}
}