[leetcode] 448. Find All Numbers Disappeared in an Array

寻找缺失数字
本文介绍了一种在O(n)运行时间内查找指定范围内未出现在数组中的所有元素的方法。此算法不使用额外空间,并且假设返回列表不计入额外空间。通过巧妙地利用原始数组进行标记,实现了高效查找。

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]

这道题是找数字区间中缺少的数字,题目难度为Easy。

题目和之前某道题描述有些相似,所以一开始就陷入了位操作的陷阱,想了很久没找到解决办法,不知道大家有没有相同的情况-_-!!

其实只需将出现过的数字标记一下就可以了,而这里空间复杂度要求O(1),所以我们要利用原始数组来辅助标记。每遍历到一个数字m,将其m-1作为下标(求余n),在该下标位置的数字上加n,以表示m出现过了,原数组中数字在1~n范围内,所以可以复原原始数字并以n为界来判断数字是否出现过。最终利用数组中仍在1~n范围的数字就可以映射出没出现的数字,数字的下标加1即是没有出现的数字。具体代码:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值