645. 错误的集合

2018-06-05  本文已影响29人  吃饭用盘装

内容

集合 S 包含从1到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个元素复制了成了集合里面的另外一个元素的值,导致集合丢失了一个整数并且有一个元素重复。

给定一个数组 nums 代表了集合 S 发生错误后的结果。你的任务是首先寻找到重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。

示例 1:

输入: nums = [1,2,2,4]
输出: [2,3]
注意:

给定数组的长度范围是 [2, 10000]。
给定的数组是无序的。


思路

根据题意:集合S应该包含1-n的连续整数,但是此时有一个元素丢失导致其他元素有一个重复,那么这里如果排序,然后再找重复元素的话,复杂度为O(nlogn),但是可以利用额外的空间来使时间复杂度将为O(n)。
将S中每个元素作为下标填入new Array(n)这个数组中,如果遍历到这个下标的位置一次,则这个位置的值+1。最后取出new Array(n)中对应值为0的下标和对应值为2的下标。


代码

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var findErrorNums = function (nums) {
    var n = nums.length;
    var array = new Array(n + 1).fill(0);
    for (var i = 0; i < nums.length; i++) {
        if (array[nums[i]] == null) {
            array[nums[i]] = 1;
        } else {
            array[nums[i]] += 1;
        }
    }

    var result = [];
    for (var i = 1; i < array.length; i++) {
        if (array[i] > 1) {
            result.push(i);
        }
    }
    for (var i = 1; i < array.length; i++) {
        if (array[i] == 0) {
            result.push(i);
        }
    }
    return result;
};

回到目录

上一篇下一篇

猜你喜欢

热点阅读