LintCode 1236: Find All Numbers Disappeared in an Array

1236. 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]

Input test data (one parameter per line)How to understand a testcase?

解法1:
这题要满足O(n)时间和没有多余空间其实不容易想。我参考的网上答案。感觉非常巧妙。
https://www.cnblogs.com/grandyang/p/6222149.html
思路就是把nums[nums[i] - 1]加上n,这样,每个nums[i]出现的话,nums[i]-1对应的地方都应该>n。所以最后扫描一遍,把<=n的i的位置记下来就可以了。

注意,因为nums[i ] - 1可能>=n,因为之前nums[i]已经加了n了,所以这里要用%n。

class Solution {
public:
    /**
     * @param nums: a list of integers
     * @return: return a list of integers
     */
    vector<int> findDisappearedNumbers(vector<int> &nums) {
        int n = nums.size();
        vector<int> result;
        for (int i = 0; i < n; ++i) {
            nums[(nums[i] - 1) % n] += n;
        }
        
        for (int i = 0; i < n; ++i) {
            if (nums[i] <= n) result.push_back(i + 1);
        }
        
        return result;
    }
};

解法2: 把nums[i]当索引,把nums[索引]对应的值*-1。处理完一遍后如果有某个nums[i]>0,那么i+1就是没有出现的元素之一。注意这里不管是重复元素还是只出现了一次的元素,nums[元素值]都会是<0。

class Solution {
public:
    vector<int> findDisappearedNumbers(vector<int>& nums) {
        int n = nums.size();
        vector<int> res;
        for (int i = 0; i < n; i++) {
            if (nums[abs(nums[i]) - 1] > 0) {
                nums[abs(nums[i]) - 1] = -1 * nums[abs(nums[i]) - 1];
            }
        }
        for (int i = 0; i < n; i++) {
            if (nums[i] > 0) {
                res.push_back(i + 1);
            }
        }
        cout << endl;
        return res;
    }
};

解法3;TBD

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值