Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.
Find all the elements of [1, n] inclusive that do not appear in this array.(简言之:找到数组缺乏的数字)
Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.
Example:
Input: [4,3,2,7,8,2,3,1] Output: [5,6]
方法一:按照规则排列后,查找出缺少的数字
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
vector<int> vec;
int len = nums.size();
for(int i = 0; i < len ; )
{
if(nums[i] != nums[nums[i]-1]) //将数字N放在nums[N-1]里
{
swap(nums[i] , nums[nums[i]-1]);
}
else
{
i++;
}
}
for(int i = 0; i < len ; i++)
{
if(nums[i] != i+1) //如果N不等于nums[N-1],则N是缺少的数字
{
vec.push_back(i+1);
}
}
return vec;
}
};
方法二:通过置负操作,记录存在的数值
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
vector<int> res;
int len = nums.size();
for(int i=0; i<len; i++) {
int m = abs(nums[i])-1; // 取绝对值,可防止前面操作将数据置为负数
nums[m] = nums[m]>0 ? -nums[m] : nums[m]; //记录数字N应该所在地址,负数代表存在该数字
}
for(int i = 0; i<len; i++) {
if(nums[i] > 0) //大于0,表示不存在该数据
res.push_back(i+1);
}
return res;
}
};