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 };