如果把每天必须做的事情都列出来,做成一个 ToDoList , 估计除了吃饭、睡觉、带薪拉屎之外,其他的我可能一件都没法完成。为什么?我也尝试过分析原因,最后得出一个结论:你永远也别想叫醒一个装睡的人,同样,你无法拯救一个明明知道自己病入膏肓的人,而我就是这个人。依旧是每天浑浑噩噩,常常对着天花板发呆,让思绪僵住,似乎也是一种快乐……突然一个激灵,今天的题来了!
题目描述
| 分类 | 困难度 | 👍 | 👎 |
|---|---|---|---|
| 算法 | 简单 (63.68%) | 663 | - |
标签
数组|公司
google给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。
找到所有在 [1, n] 范围之间没有出现在数组中的数字。
您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。
示例 :
输入:
[4,3,2,7,8,2,3,1]
输出:
[5,6]
思路分析
首先想到的就是通过数组是否包含某个元素来判断,[1, n]数组中数组的长度为 n, 循环数组(1~n),理论上数组要包含1,2,3...n,也就是从 1 开始的索引值,因此如果索引值没在数组中就是没有出现的数字。
AC 代码
暴力解法
/*
* @lc app=leetcode.cn id=448 lang=javascript
*
* [448] 找到所有数组中消失的数字
*/
// @lc code=start
/**
* @param {number[]} nums
* @return {number[]}
*/
var findDisappearedNumbers = function(nums) {
const arr = []
for(let i = 1; i <= nums.length; i++) {
if(!nums.includes(i)){
arr.push(i)
}
}
return arr
};
// @lc code=end
// 34/34 cases passed (8396 ms)
// Your runtime beats 14.88 % of javascript submissions
// Your memory usage beats 85.7 % of javascript submissions (45.7 MB)
另一种数组元素判断
其实就是第一种方法,先凑个数,好比我是胡乙己。
/*
* @lc app=leetcode.cn id=448 lang=javascript
*
* [448] 找到所有数组中消失的数字
*/
// @lc code=start
/**
* @param {number[]} nums
* @return {number[]}
*/
var findDisappearedNumbers = function(nums) {
const arr = []
for(let i = 1; i <= nums.length; i++) {
if(nums.indexOf(i) === -1){
arr.push(i)
}
}
return arr
};
// 34/34 cases passed (8628 ms)
// Your runtime beats 7.89 % of javascript submissions
// Your memory usage beats 72.84 % of javascript submissions (45.8 MB)
有趣的是:
[NaN].indexOf(NaN) > -1 // false
[NaN].includes(NaN) // true
[,].indexOf(undefined) > -1 // false
[,].includes(undefined) // true
总结
今天就先到这,进阶的解法暂时没想到,一些概念也还在学习中。如果您能指点指点,欢迎留言鞭策!
本文正在参与「掘金 2021 春招闯关活动」, 点击查看活动详情