442. Find All Duplicates in an Array

问题:

给定一个数组,1 ≤ a[i] ≤ n (n = size of array),其中一些元素出现2次,其他出现1次,

求 出现两次的这些元素。

要求:不借助额外空间,时间复杂度为O(n)

解法:

抓住该题目给定数组的特性:

·所有元素 在1~n之间,可联系到 数值 和 偏移位置 的对应关系。

·仅出现2次或1次,可联系到正负数的特性。负负得正,一负为负。

那么,可得一下解法:

遍历一次数组,读到一个数值,把其作为index,去标记index对应的值。标记方法为 取反

每次标记完后,再去判断刚刚标记的数值

·正数:那么负负得正,一定被标记过2次

·负数:一负的负,一定被标记过1次

由于最多被标记两次,那么只要是正数,由于刚刚才被标记过一次,那么在此次之前,它必然已被标记过一次,也就是出现了2次。

追加该数值到结果。

代码参考:

 1 class Solution {
 2 public:
 3     vector<int> findDuplicates(vector<int>& nums) {
 4         vector<int> res;
 5         for(int i=0; i<nums.size(); i++){
 6             nums[abs(nums[i])-1]=-nums[abs(nums[i])-1];
 7             if(nums[abs(nums[i])-1]>0) res.push_back(abs(nums[i]));
 8         }
 9         return res;
10     }
11 };
原文地址:https://www.cnblogs.com/habibah-chang/p/12711025.html