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。也是有这两种方法

posted @ 2019-09-06 23:34  于老师的父亲王老爷子  阅读(18)  评论(0)    收藏  举报