https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/
题目要求不使用额外空间,并且时间复杂度为O(n)
思路:若元素值a[ i -1 ]与其序号 i 不等,并且a[i-1] 与 a[ a[i-1] -1] 不等,则将a[i-1] 与 a[ a[i-1] -1] 对调位置后,
两者对调后至少有一个元素与其序号能吻合,则最多对调n次即可。
再次扫描一遍数组,将元素值与序号不等的位置的序号添加到结果数组,输出即可。
与剑指offer第3题 “数组中重复的数字” 异曲同工。
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
vector<int> result;
if(nums.size()==0)
return result;
int n = nums.size(), i=1;
bool out = true;
while(i<=n){
while(out) {
if(nums[i-1]==i)
out = false;
else if(nums[i-1]!=nums[ nums[i-1]-1 ])
{
int tmp = nums[i-1];
nums[i-1]=nums[tmp-1];
nums[tmp-1]=tmp;
}
else
out = false;
}
out = true;
i++;
}
i=1;
while(i<=n){
if(nums[i-1]!=i)
result.push_back(i);
i++;
}
return result;
}
};