题目:含有从1~n(数组size)数值的数组,里面存在重复元素,求缺掉的数字。
要求:不使用多余辅助空间,时间复杂度为(n)的算法
方法:
利用 原数组index 一一对应 所求连续数列的数值 的特点,
顺次遍历数组的同时,遇到某个值,使用正负号来标记已遇到。
最后在遍历一次,没遇到过的(即所求缺掉的)就是没有标记过的(正数)。
注意:由于要使用数值去表示index,而遍历过的,会将数值转为负数,
因此,在利用数值表示index之前,先取绝对值abs
参考代码:
1 class Solution { 2 public: 3 vector<int> findDisappearedNumbers(vector<int>& nums) { 4 vector<int> res; 5 for(int i=0; i<nums.size(); i++){ 6 int m = abs(nums[i]) -1; 7 if(nums[m]>0){ 8 nums[m] = -nums[m]; 9 } 10 } 11 for(int i=0; i<nums.size(); i++){ 12 if(nums[i]>0) res.push_back(i+1); 13 } 14 return res; 15 } 16 };