题目链接:leetcode442
题面
题目大意
略
解题思路
哈希
这种问题大致可以分成两类,如果找重复两次的数可以用哈希;如果找不重复的数可以用异或,然后按某个位为 1 开始划分。
本题要找重复两次的数,于是可以采用哈希,具体就是使得 n u m s ( i ) = = i nums(i)==i nums(i)==i ,这样不重复的数一定归位,而重复的数一定有一个不能归位,那么找出那些不能归位的数即可。
代码实现
class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
std::ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
vector<int> res;
for (int i = 0; i < nums.size(); i++) {
while (nums[nums[i]-1] != nums[i])
swap(nums[nums[i]-1], nums[i]);
}
for (int i = 0; i < nums.size(); i++) {
if (nums[i] != i+1) {
res.push_back(nums[i]);
}
}
return res;
}
};