找到所有数组中消失的数字(超易懂!!!!)

给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。

示例 1:

输入:nums = [4,3,2,7,8,2,3,1]
输出:[5,6]

示例 2:

输入:nums = [1,1]
输出:[2]

首先,应该着重考虑到时间复杂度,空间复杂度的限制。

可以利用nums自身作为hash表进行遍历的同时,对数据进行修改。

第一步:如果数x出现了,则下标为(x-1)的数会进行修改(这个修改方式,我们下面在进行讨论)

如果数n没有出现,则下标为n-1的数不会进行改变,如果数n出现了多次,那么下标为n-1的数就会进行多次的修改。

那么现在问题就简化为,对于出现的数,我们应该用什么样的修改方式,使其无法与那些未进行修改的数进行区别呢??

第二步:修改方式:因为数的大小范围是在[1,n],因此,我们可以修改出现的数,使其值更改为大于n。

for(auto& num:nums)
        {
            int x=(num-1)%n;
            nums[x]+=n;
        }

 第三步:未出现的值,其未进行修改,可以在遍历中根据其大小直接进行筛选:

 for(int i=0;i<n;i++)
        {
            if(nums[i]<=n)
            {
                theEnd.push_back(i+1);
            }
        }

个人觉得,第一步是这题解法思想的重中之重,而对于数据的修改方式可以有多种方式与方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值