给你一个含 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);
}
}
个人觉得,第一步是这题解法思想的重中之重,而对于数据的修改方式可以有多种方式与方法。