LeetCode:448. Find All Numbers Disappeared in an Array

一道easy的题目,但是有一个比较有意思的思路:
方法一:
自己之前遇到过类似的题目:尽量把每个数字放到该放的位置上。
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
vector<int> ret;
for (int i = 0; i < nums.size(); ++i) {
while (nums[i] != i+1 && nums[nums[i]-1] != nums[i])
swap(nums[i], nums[nums[i]-1]);
}
for (int i = 0; i < nums.size(); ++i) {
if (nums[i] != i+1)
ret.push_back(i+1);
}
return ret;
}
};
方法二:
评论区看来的,有点意思:
遇到一个数字,就把它本该在的那个位置的数字变为负数。然后最后再遍历一遍,哪些位置没有变为负数,就知道应该在这个位置的数字没有。
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
vector<int> ret;
for (int i = 0; i < nums.size(); ++i) {
int val = abs(nums[i]) - 1;
if (nums[val] > 0)
nums[val] = -nums[val];
}
for (int i = 0; i < nums.size(); ++i)
if (nums[i] > 0)
ret.push_back(i+1);
return ret;
}
};
而且相对于第一种方法,好处在于:不用额外的空间就可以恢复数组本来的样子(最后把每个元素变为正数就可以了)。第一种方法只有借助额外空间才可以不打乱原来的排序。
另外一道类似的题目:442. Find All Duplicates in an Array。也是有这两种方法
浙公网安备 33010602011771号