LeetCode #448 - Find All Numbers Disappeared in an Array

本文介绍了一种高效查找数组中缺失数字的方法,利用O(n)时间复杂度和原地修改技术,避免了使用额外空间。通过将数组元素值作为索引来构建特殊的链表,并通过检查元素值的正负来确定哪些数字未出现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

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]的范围内,有的数出现一次,有的数出现两次,求1~n中没有出现的数,时间复杂度为O(n),不能用额外空间。由于数组元素大小的特殊性,可以令元素的值作为下一个元素的下标形成链表,依次遍历的时候对每个遍历到的元素做标记,而在数组中没有标记的元素的下标即为所求,那么要做标记同时保证不真正影响元素的值的最简单的方法就是取负数。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值