题目:
找出数组中重复的数字,在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
式例一:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:
2 或 3
分析:
可以采用排序法,将数组排序后,依次比较相邻元素,查看是否相等,相等就返回。
也可以采用哈希表法,将数组中的元素存入哈希表中,当存入时发现哈希表有该元素则返回。
想求最优解,要擅于利用图中的条件,题目中说数组长度为n且数组中所有数字都在0-n-1范围内,可以用下标法,通过不停交换元素使得元素和它对应的下标相等,这样方便判断重复元素。最优解时间复杂度O(n),空间复杂度为O(1)。
代码:

//    下标法
public int findRepeatNumber3(int[] nums) {
for (int i = 0; i < nums.length; i++) {
//用while交换之后,该位置的元素仍然没有在正确的位置
while (i != nums[i]){
if (nums[i] == nums[nums[i]]){
//重复
return nums[i];
}
int k = nums[nums[i]];
nums[nums[i]] = nums[i];
nums[i] = k;
}
}
return -1;
}

数组中重复的数字_数组