原题链接
思路与算法
我们也可以给 加上「负号」表示数 已经出现过一次。具体地,我们首先对数组进行一次遍历。当遍历到位置 时,我们考虑 的正负性:
如果 是正数,说明 还没有出现过,我们将 加上负号;
如果 是负数,说明 已经出现过一次,我们将 放入答案。
细节
由于 本身可能已经为负数,因此在将 作为下标或者放入答案时,需要取绝对值。
复杂度分析
时间复杂度:。我们只需要对数组 进行一次遍历。
空间复杂度:。返回值不计入空间复杂度。
typescript
function findDuplicates(nums: number[]): number[] {
const answer: number[] = [];
for (let i = 0; i < nums.length; i++) {
const abs = Math.abs(nums[i]);
const target = nums[abs - 1];
if(target > 0) {
// 说明nums[i] 还没有出现过
nums[abs - 1] = -target;
} else {
answer.push(abs);
}
}
return answer;
};