找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
解题思路1:哈希表
1.创建一个哈希表
2.遍历nums数组中每个元素
如果该元素在哈希表中的值为true
则返回该值
如果不为true或该元素不在哈希表中
则把该元素添加进哈希表中,
并且赋值为true。
3.返回-1。(表示无重复值)
代码:
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
// 第一步
unordered_map<int,bool>map;
// 第二步
for(int num : nums) {
if(map[num]==true)
return num;
map[num]=true;
}
// 第三步
return -1;
}
};
图解:
也就是在哈希表中寻找该元素,并且判断其值是否为true。如果在哈希表中没有找到,就把该元素添加进哈希表中,并且赋值true给它。
解题思路2:换位索引
1.设索引值 i=0
2.遍历数组nums
如果第 i 个位置的元素等于 i (nums[i]=i)
则i++,进行下个循环
如果该元素对应的下标的元素等于该元素
(nums[nums[i]]==nums[i])
则返回该元素(出现一对多,说明重复)
否则交换该元素与该元素对应的下标的元素,继续下个循环
3.返回 -1 (说明没有重复数字)
代码:
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
// 第一步
int i=0;
// 第二步
while(i<nums.size()) {
if(nums[i]==i) {
i++;
continue;
}
if(nums[nums[i]]==nums[i])
return nums[i];
swap(nums[i],nums[nums[i]]);
}
// 第三步
return -1;
}
};
图解:
因为题目说:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。有重复,说明一定会有一对多的情况。所以可以通过索引
交换他们的位置,并且等于索引值,然后就可以通过索引来判断是否重复。