Find All Duplicates in an Array

Same sign-flip trick — if `nums[|v| - 1]` is already negative, `|v|` is a duplicate.

Medium
Time O(n) Space O(1)
LeetCode
2 min read
array in-place-hash

Problem#

nums of length n has values in [1, n], each appearing once or twice. Return all values that appear twice. Use O(1) extra space.

Examples#

  • [4,3,2,7,8,2,3,1][2,3].
  • [1,1,2][1].

Constraints#

  • 1 <= n <= 10^5.

Approach#

For each v, look at nums[|v| - 1]. If positive, negate it (first sighting). If already negative, |v| is a duplicate.

Solution#

Find All Duplicates in an Array
class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
vector<int> ans;
for (int v : nums) {
int i = abs(v) - 1;
if (nums[i] < 0) ans.push_back(i + 1);
else nums[i] = -nums[i];
}
return ans;
}
};

Editorial#

Same sign-flip trick as “Find All Numbers Disappeared”. The second occurrence is detected because the slot has already been flagged negative on the first sighting.

Complexity#

  • Time: O(n).
  • Space: O(1) extra.

Concept revision#

Search ESC

Keyboard shortcuts

Shortcuts are disabled while typing in inputs.