1、最慢的方式是两层for循环,不考虑;
2、更先进的方法是这样的:不考虑是否直接出现了这个数,而考虑这个数是否出现在了下标中,即:以nums[i]
为索引标记这个位置,最后没有标记的位置就是缺失的数。也就是将数组中的数看作索引。这里被标记处的数置负,abs后可以重新使用。
3、为了优化性能,可以使用双目运算符;
4、在牺牲空间的前提下,可以省去第一次标记时的判断
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
vector<int> result;
for(int i = 0; i < nums.size(); i++){
int val = abs(nums[i]) - 1;
nums[val] = (nums[val] > 0 ? -nums[val] : nums[val]);
}
for(int i = 0; i < nums.size(); i++){
if(nums[i] > 0)
result.push_back(i + 1);
}
return result;
}
};
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
vector<int> result;
vector<int> flag(nums.size(), 0);
for(int i = 0; i < nums.size(); i++){
flag[nums[i] - 1] = 1;
}
for(int i = 0; i < nums.size(); i++){
if(!flag[i])
result.push_back(i+1);
}
return result;
}
};