# 442.数组中重复的数据 (Medium)

## 问题描述
[442. 数组中重复的数据 (Medium)](https://leetcode.cn/problems/find-all-duplicates-in-an-array/)

给你一个长度为 `n` 的整数数组 `nums` ，其中 `nums` 的所有整数都在范围 `[1, n]`
内，且每个整数出现 **一次** 或 **两次** 。请你找出所有出现 **两次** 的整数，并以数组形式返回。

你必须设计并实现一个时间复杂度为 `O(n)` 且仅使用常量额外空间的算法解决此问题。

**示例 1：**

```
输入：nums = [4,3,2,7,8,2,3,1]
输出：[2,3]

```

**示例 2：**

```
输入：nums = [1,1,2]
输出：[1]

```

**示例 3：**

```
输入：nums = [1]
输出：[]

```

**提示：**

- `n == nums.length`
- `1 <= n <= 10⁵`
- `1 <= nums[i] <= n`
- `nums` 中的每个元素出现 **一次** 或 **两次**

## 解题思路
参照[41.缺失的第一个正数 (Hard)](https://blog.zwyyy456.tech/zh/posts/leet/41.first-missing-positive/)，将数置反，如果已经是负数了，再减去`nums.size()`。

这里要注意`nums.size()`是无符号整数，直接加上负号结果也不是负数。

## 代码
```cpp
class Solution {
public:
    vector<int> findDuplicates(vector<int>& nums) {
        for (int i = 0; i < nums.size(); ++i) {
            int num = abs(nums[i]);
            if (num > nums.size()) {
                num -= nums.size();
            }
            if (nums[num - 1] > 0) {
                nums[num - 1] = -nums[num - 1];
            } else {
                nums[num - 1] -= nums.size();
            }
        }
        vector<int> res;
        for (int i = 0; i < nums.size(); ++i) {
            if (nums[i] < -static_cast<int>(nums.size())) {
                res.push_back(i);
            }
        }
        return res;
    }
};
```
