给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。
Claim: 空间复杂度O(1) / 时间复杂度O(n)
Example:
Input: [4,3,2,7,8,2,3,1] Output: [5,6]
Thinking:
1. 依次遍历数组;
2. 并将数组内数字所映射到数组上对应的位置,并取负值;
3. 重新遍历数组,若数组内数字不为负,则对应位置+1为缺失项。
code:
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
int len = nums.size();
//遍历数组并将对应位置取负
for(int i = 0; i < len; i++)
{
if(nums[abs(nums[i])-1] > 0)
nums[abs(nums[i]) - 1] = -abs(nums[abs(nums[i]) - 1]);
}
//再次遍历,非负项对应的地址+1为缺失项
vector<int> ans;
for(int j = 0; j < len; j++)
{
if(nums[j] > 0)
ans.push_back(j+1);
}
return ans;
}
};