Description
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]
Solution
問題的關鍵是利用1->n的數字和總長度n的對應關係!!
不用額外空間進行記錄出現過的數字方式 =>
用出現的位置正負來記錄!! 思路很巧妙
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int> &nums) {
vector<int> res;
for (int i = 0; i < nums.size(); ++i) {
int idx = abs(nums[i]) - 1;
nums[idx] = nums[idx] > 0 ? -nums[idx] : nums[idx];
}
for (int i = 0; i < nums.size(); ++i) if (nums[i] > 0) res.push_back(i+1);
return res;
}
};
類似的問題還有”找出重複數字”,”找出唯一不重複數字”