442. Find All Duplicates in an Array
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 most twice, 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 < = 1 0 5 1 <= n <= 10^5 1<=n<=105
- 1 <= nums[i] <= n
- Each element in nums appears once or twice.
From: LeetCode
Link: 442. Find All Duplicates in an Array
Solution:
Ideas:
1. Loop Through Array:
- For each element nums[i], determine the target index as abs(nums[i]) - 1.
- If the value at nums[index] is negative, the number abs(nums[i]) has already been seen, so add it to result.
- If it’s positive, make it negative to mark it as visited.
2. Output Preparation:
- result holds all duplicates, and returnSize tracks the count of duplicates.
3. Memory Management:
- The result array is allocated dynamically, and the caller is responsible for freeing it.
Code:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* findDuplicates(int* nums, int numsSize, int* returnSize) {
int* result = (int*)malloc(numsSize * sizeof(int));
*returnSize = 0;
for (int i = 0; i < numsSize; i++) {
int index = abs(nums[i]) - 1; // Convert value to index
if (nums[index] < 0) {
// If already negative, it's a duplicate
result[(*returnSize)++] = abs(nums[i]);
} else {
nums[index] = -nums[index]; // Mark as visited by making it negative
}
}
return result;
}