Given an integer array nums of length n where all the integers of nums are in the range [1, n] and each integer appears at mosttwice, return an array of all the integers that appears twice.
You must write an algorithm that runs in O(n) time and uses only constant auxiliary space, excluding the space needed to store the output
Example 1:
Input: nums = [4,3,2,7,8,2,3,1]
Output: [2,3]
Example 2:
Input: nums = [1,1,2]
Output: [1]
Example 3:
Input: nums = [1]
Output: []
Constraints:
n == nums.length
1 <= n <= 105
1 <= nums[i] <= n
Each element in nums appears once or twice.
Solutions
Solution 1
Thinking
Values lie in \([1,n]\) and appear at most twice; the follow-up wants linear time and constant extra memory. A hash set finds duplicates but uses \(O(n)\) space.
Swap \(v\) into index \(v-1\) (cycle sort). Afterwards a value that is not \(i+1\) at index \(i\) is a leftover duplicate.
The swap loop stops when \(nums[i]=nums[nums[i]-1]\), so a duplicate collides with the value already in place and never cycles forever.