leetCode 编号448

20 阅读1分钟

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

思路:
  1. 遍历 [1, n],找出在nums中不存在的元素即可
  2. 一开始采用的直接判断是否在nums存在if(nums.indexOf(i) == -1) { result.push(i) },提交报超出时间限制,OK想办法缩减时间
  3. 在JS的内置对象中有一个Set对象,Set 对象允许你存储任何类型(无论是原始值还是对象引用)的唯一值,这一步首先就先排除了重复的元素,其次 Set 对象的has 方法可以检查某个值是否在集合中,而且其采用的方式的平均时间比逐个测试先前添加到集合中的元素更快。特别是当一个数组的长度(length)等于集合的大小(size)时,这比 Array.prototype.includes 方法的平均速度更快,所以其检索某个值的时间将比indexOf的方式更少,提交完成
/**
 * @param {number[]} nums
 * @return {number[]}
 */
var findDisappearedNumbers = function(nums) {
    let n = nums.length
    let result = []
    let set = new Set(nums);
    for(let i = 1; i <= n; i++) {
        // if(nums.indexOf(i) == -1) {
        //     result.push(i)
        // }
        if(!set.has(i)) {
            result.push(i)
        }
    }
    return result
};