Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述
- 给你一个含 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]
- 提示
n == nums.length1 <= n <= 1000001 <= nums[i] <= n
二、思路分析:
- 数组内有
n个数字,取值范围为[1,n],遍历数组,循环参数i和数组长度n是有直接关系的 - 遍历数组,参数
i的取值刚好为数组没有消失时的范围值,内循环里遍历给定数组的每一项- 如果在数组中找到和
i相等的值,说明这个值没有消失,退出当前循环 - 如果找到数组的最后一项都没有找到和
i相等的值,说明该数字已经在数组中确实,添加到定义好的数组变量里返回
- 如果在数组中找到和
三、AC 代码:
function findDisappearedNumbers(nums: number[]): number[] {
let result: Array<number> = [];
for(let i = 1; i <= nums.length; i++){
for(let j = 0; j < nums.length; j++){
if(i === nums[j]){
break;
}
if(j === nums.length - 1 && i !== nums[j]){
result.push(i)
}
}
}
return result
};
四、总结:
- 在遍历数组前可以先将数组排序,因为
i的取值是从小到大的,所以比较的时候也是从数组的第一个开始取,如果存在相等的,可以尽快找到并退出循环,避免无效循环,小优化一下 - 进阶: 你能在不使用额外空间且时间复杂度为 **
O(n)**的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。感兴趣去试试。 - 更多解题方式,移步题解区