LeetCode 442
https://leetcode.cn/problems/find-all-duplicates-in-an-array/description/
难度:中等
高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/
对于数组大小和数据范围基本相同的题目,考虑原地哈希。
交换元素到其应到的位置,最后不在正确位置的元素说明重复。
时间复杂度:O(n)。每一次交换操作会使得至少一个元素被交换到对应的正确位置,因此交换的次数为 O(n),总时间复杂度为 O(n)。
空间复杂度:O(1)。返回值不计入空间复杂度。
class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
vector<int> ans;
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 (i != nums[i] - 1) {
ans.push_back(nums[i]);
}
}
return ans;
}
};