内容
集合 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;
};
网友评论