目录
数组中重复的数字
描述
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1
输入
[2, 3, 1, 0, 2, 5, 3]
输出
2 或 3
限制
2 <= n <= 100000
方法一:Map键值对
我们利用Map集合的特性,将所有元素依次放入map集合中,当集合中有该元素时,将元素返回即可。
class Solution {
public int findRepeatNumber(int[] nums) {
Map<Integer,Integer> map=new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (map.containsKey(nums[i])){
return nums[i];
}else{
map.put(nums[i],1);
}
}
return -1;
}
}
同样也可以利用set集合的特性,set不允许值重复,所以依次添加元素,如果添加失败证明该元素重复,但是其用时较短,
方法二:原地交换法
通过调整数组内元素位置,使数组变成当前下标存放的值就是下标数,在调整交换的过程中,如果一个数字出现在相同下标处,则判定为重复数字。(利用题目长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内这个特点),通俗来讲就是元素3要放在arr[3]这个位置。
class Solution {
public int findRepeatNumber(int[] nums) {
for (int i = 0; i < nums.length; i++) {
if (i==nums[i]){
continue;
}else{
if (nums[nums[i]]==nums[i]){//如果该位置的元素和下标值相等,证明和当前元素重复了
return nums[i];
}else{
int temp=nums[nums[i]];
nums[nums[i]]=nums[i];
nums[i]=temp;
i--;//交换完后继续看交换过来的元素应该要放在哪里
}
}
}
return -1;
}
}