448. Find All Numbers Disappeared in an Array。

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]


给定一个数组,并且数组中的元素都是在这个数组长度n范围之内的。而且数组其中的元素有些出现了一次,有些出现了两次,需要找出在[1,n]中有哪些数字没有在数组中出现。说白了也就是给了一个长度为n的数组,数组中的内容本来应该是1到n的,结果有些数字重复了一次,所以导致有些数字没有出现,我们需要扎到这些没有出现的数字。

这道题与之前的那个 442. Find All Duplicates in an Array。思路类似,理解了上面的那个,解决这个就非常的简单。

在梳理一下思路:长度为n的数组,本来应该存方0到n的,结果有些重复了。那么我们其实是可以利用数组中的元素作为下标重新定义这个数组,因为数组中的元素减去1之后不会超出这个数组的长度。然后我们用新的下标去将数组中的内容进行判断,如果大于0则取反。这样最后数组中重复的元素因为两次都访问的是一个地方,所以第二个重复的元素没有发生改变,还是正数。

比如[1,2,2,4]这个数组,我们使用其中的元素减去1之后重新定义数组:根据下标查找数组,如果数组中内容大于0,则让数组对应下标的内容取反。

操作步骤应该是这样的:

拿到了第一个元素:1,减去1得到:0。发现对应位置的内容大于0,则取反得到新数组:[-1,2,2,4]。
拿到了第二个元素:2,减去1得到:1。发现对应位置的内容大于0,则取反得到新数组:[-1,-2,2,4]。
拿到了第三个元素:2,减去1得到:1。发现对应位置的内容小于0,则不进行操作:[-1,-2,2,4]。
拿到了第四个元素:4,减去1得到:3。发现对应位置的内容大于0,则取反得到新数组:[-1,2,2,4]。

最后得到数组中,第三个元素为正的。如果数组中是[1,n]的话,是会访问第三个元素的,但是此时没有访问就说明数组中根本没有第三个元素。


C++代码:

class Solution {
public:
    vector<int> findDisappearedNumbers(vector<int>& nums) {
        vector<int> res;
        for(int n: nums) {
            n = abs(n);
            if(nums[n-1] > 0) {
                nums[n-1] = -nums[n-1];
            }
        }

        for(int i=0;i<nums.size();i++) {
            if(nums[i] > 0) {
                res.push_back(i+1);
            }
        }

        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值