在一个长度为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都是对的
思路:最初想法是建立一个数组存储数字的出现次数,这样的时间和空间复杂度都是O(n)。但是这道题目还可以将空间复杂度优化到O(1),就利用原本的数组,由于数组共有n个数,且范围都在0-n-1的范围里,可以将每个数都放置在与它的值相同的位置上,如果出现位置上已经有对应的数还需要放置的情况则是有重复,返回那个数。
代码:
public int duplicate (int[] numbers) {
int n = numbers.length;
for(int i = 0; i < n;i++)
{
while(numbers[i] != i)
{
int temp = numbers[numbers[i]];
if(temp == numbers[i])
{
return temp;
}
else
{
numbers[numbers[i]] = numbers[i];
numbers[i] = temp;
}
}
}
return -1;
}