题目
代码(首刷自解)
这题和Leetcode 剑指 Offer 03. 数组中重复的数字不一样的地方在于,这题不需要考虑0,所以可以直接乘以-1。
class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
vector<int> res;
for(int& n : nums) {
if(nums[abs(n)-1] < 0) {
res.push_back(abs(n));
} else {
nums[abs(n)-1] *= -1;
}
}
return res;
}
};
当然也能用模板方法解,for套while
class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
vector<int> res;
int n = nums.size();
for(int i = 0; i < n; i++) {
while(nums[i] != nums[nums[i]-1]) {
swap(nums[i], nums[nums[i]-1]);
}
}
for(int i = 0; i < n; i++) {
if(nums[i] != i+1)
res.push_back(nums[i]);
}
return res;
}
};