448. 找到所有数组中消失的数字|刷题打卡
create by db on 2021-3-6 16:46:24
Recently revised in 2021-3-6 16:56:30
闲时要有吃紧的心思,忙时要有悠闲的趣味
题目描述
给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。
找到所有在 [1, n] 范围之间没有出现在数组中的数字。
您能在不使用额外空间且时间复杂度为 O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。
示例:
输入:
[4,3,2,7,8,2,3,1]
输出:
[5,6]
思路分析
思路一:遍历查找
已知数组中元素范围为 1-n,那么从 1 遍历至 n,依次查找元素是否存在,不存在的放入新数组。时间复杂度 O(n),空间复杂度 O(1)
思路二:数组置换
使用数组的下标来标记数字的出现于否,出现过就标记为负值。通过一遍遍历即可标记出全部已经出现的数字(已置换为负值)
然后再遍历一次,数组中为正值的元素所在的下标+1 就是未出现过的数字。
AC 代码
题解一:遍历查找
/**
* @param {number[]} nums
* @return {number[]}
*/
var findDisappearedNumbers = function (nums) {
// 声明新数组
let arr = []
// 遍历1至数组长度之间的数字
for (let i = 1; i <= nums.length; i++) {
// 若果当前数组没有则加入新数组
if (nums.indexOf(i) === -1) {
arr.push(i)
}
}
return arr
}
题解二:数组置换
// 输入[4,3,2,7,8,2,3,1]
// 数组元素范围为 1-n,n 为数组长度,0-(n-1)为数字元素下标
// 将出现的 Math.abs(nums[i])-1 下标对应的元素变为负的,说明数组中有 nums[i]这个数
// 而那些大于 0 的数组元素的(下标+1)是数组中消失的数
for (let i=0; i<nums.length; i++){
let newIndex = Math.abs(nums[i]) - 1
if (nums[newIndex] > 0) {
nums[newIndex] \*= -1
}
}
// 遍历完成后,数组变为[-4,-3,-2,-7,8,2,-3,-1]
/**
* @param {number[]} nums
* @return {number[]}
*/
var findDisappearedNumbers = function (nums) {
// 声明新数组
let arr = []
// 遍历原数组
for (let i of nums) {
// 将下标为i的元素置换为负值
// 使用Math.abs()确保绝对值为正数
nums[Math.abs(i) - 1] = -Math.abs(nums[Math.abs(i) - 1])
}
for (let j in nums) {
// 没出现的元素(大于0)等于下标+1
if (nums[j] > 0) {
arr.push(j + 1)
}
}
return arr
}
总结
菜狗只配捏软柿子……
明天去看樱花喽!
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情
后记:Hello 小伙伴们,如果觉得本文还不错,记得点个赞或者给个 star,你们的赞和 star 是我编写更多更丰富文章的动力!GitHub 地址
文档协议
db 的文档库 由 db 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于github.com/danygitgit上的作品创作。
本许可协议授权之外的使用权限可以从 creativecommons.org/licenses/by… 处获得。