找到所有数组中消失的数字

415 阅读1分钟

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.length
    • 1 <= n <= 100000
    • 1 <= 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) **的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。感兴趣去试试。
  • 更多解题方式,移步题解区

image.png