题目
1. 去重查找:
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
unordered_set<int> s; // 去重
vector<int> ans;
for(int x : nums)
s.insert(x);
for(int i = 1; i <= nums.size(); ++i)
if(!s.count(i))
ans.push_back(i);
return ans;
}
};
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
vector<int> ans;
unordered_map<int, bool> mp;
for(int x : nums)
mp[x] = true;
for(int i = 1; i <= nums.size(); ++i)
if(mp[i] == false)
ans.push_back(i);
return ans;
}
};
2. 标记法
将数组中每个值所对应的位置标记为负数,那么标记结束后数组中正数所对应的位置即为所求。
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
for(int i = 0; i < nums.size(); ++i) {
int k = nums[i];
k = k > 0 ? k : 0 - k; // 处理负数
if(nums[k - 1] > 0) // 标记,由于数字从1开始,数组从0开始,因此对应位置要 -1
nums[k - 1] = 0 - nums[k - 1];
}
vector<int> ans;
for(int i = 0; i < nums.size(); ++i)
if(nums[i] > 0)
ans.push_back(i + 1); // 结果
return ans;
}
};