leetcode 算法题448 (简单114) 找到所有数组中消失的数字
- 题目介绍
给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,
数组中的元素一些出现了两次,另一些只出现一次。
找到所有在 [1, n] 范围之间没有出现在数组中的数字。
您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗?
你可以假定返回的数组不算在额外空间内。
- 示例
输入: [4,3,2,7,8,2,3,1]
输出: [5,6]
- 解法一
/**
* @param {number[]} nums
* @return {number[]}
*/
var findDisappearedNumbers = function(nums) {
let dis = [], i = 1;
while(i <= nums.length) {
if(nums.indexOf(i) === -1) {
dis.push(i);
}
i++;
}
return dis;
};
执行用时 : 9888 ms, 在所有 JavaScript 提交中击败了5.56%的用户
内存消耗 : 43.8 MB, 在所有 JavaScript 提交中击败了67.24%的用户
- 解法二
/**
* @param {number[]} nums
* @return {number[]}
*/
var findDisappearedNumbers = function(nums) {
let dis = [], i = 0, j = 1;
nums.sort((n1, n2) => n1 - n2);
while(i < nums.length) {
if(nums[i] === j) {
i++;
j++;
} else if(nums[i] > j){
dis.push(j++);
} else {
i++;
}
}
while(j <= nums.length) {
dis.push(j++);
}
return dis;
};
执行用时 : 244 ms, 在所有 JavaScript 提交中击败了35.29%的用户
内存消耗 : 44.9 MB, 在所有 JavaScript 提交中击败了32.76%的用户
- 解法三
/**
* @param {number[]} nums
* @return {number[]}
*/
var findDisappearedNumbers = function(nums) {
let dis = [], i = 0;
while(i < nums.length) {
nums[(nums[i++] - 1) % nums.length] += nums.length;
}
i = 0;
while(i < nums.length) {
if(nums[i++] <= nums.length) {
dis.push(i);
}
}
return dis;
};
执行用时 : 136 ms, 在所有 JavaScript 提交中击败了93.46%的用户
内存消耗 : 43.8 MB, 在所有 JavaScript 提交中击败了67.24%的用户
- 解法四
/**
* @param {number[]} nums
* @return {number[]}
*/
var findDisappearedNumbers = function(nums) {
let dis = [], i = 0;
while (i < nums.length) {
while(nums[i] !== nums[nums[i] - 1]) {
swap(nums, i, nums[i] - 1);
}
i++;
}
i = 0;
while (i < nums.length) {
if(nums[i] !== ++i) {
dis.push(i);
}
}
return dis;
};
const swap = (nums, i, j) => {
nums[i] = nums[i] ^ nums[j];
nums[j] = nums[i] ^ nums[j];
nums[i] = nums[i] ^ nums[j];
}
执行用时 : 156 ms, 在所有 JavaScript 提交中击败了65.52%的用户
内存消耗 : 44.7 MB, 在所有 JavaScript 提交中击败了39.66%的用户