找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3
限制:
2 <= n <= 100000
Related Topics
哈希排序之类的解法都很好理解,不做赘述了,主要就讲下原地交换的解法
照旧,看图,主要还是利用的数组本身下标作为哈希来实现的,用数组代替哈希表来实现哈希是中常用的哈希优化方法,必要的话还是需要掌握下
第一行对应下标索引,从第二行开始为数字,每行表示每次操作的事项
第一行对应下标索引,从第二行开始为数字,每行表示每次操作的事项
- 从下标0开始,下标0上的数字为2,把下标0和下标2上的数字交换
- 此时下标0上的数字已经变为1了,继续和下标1上的数字交换
- 此时下标0上的数字已经变为3了,继续和下标3上的数字交换
- 此时下标0上的数字已经变为1了
- 往后依次查找,下标和上面的值是否相等
- 直到遇到下标4的时候,下标4上的值为2,那么和下标2进行交换,但是下标2上的值已经为2了,此时冲突发生,直接返回结果2
class Solution {
public int findRepeatNumber(int[] nums) {
int i = -1;
while ( ++i < nums.length ){
if(nums[i]==i)continue;
while (nums[i]!=i){
if (nums[nums[i]] == nums[i]){
return nums[i];
}
swap(nums,i,nums[i]);
}
}
return -1;
}
public void swap(int[] nums,int i, int j){
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}
发表评论