448. 找到所有数组中消失的数字

简介: 448. 找到所有数组中消失的数字

 448. 找到所有数组中消失的数字

给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。

示例 1:

输入:nums = [4,3,2,7,8,2,3,1]

输出:[5,6]


示例 2:

输入:nums = [1,1]

输出:[2]


提示:

  • n == nums.length
  • 1 <= n <= 105
  • 1 <= nums[i] <= n

进阶:你能在不使用额外空间且时间复杂度为 O(n) 的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。


思路

  • 方法1:利用map统计数字是否出现过
  • 方法2:本质上是把原数组上对应index的值取负来标识某个值是否出现过


时间复杂度:均为O(n)


空间复杂度:方法1 - O(n),方法2 - O(1)

// // 方法1,利用map统计次数:// 空间复杂度:O(N)// func findDisappearedNumbers(nums []int) []int {//     m := make(map[int]int)//     for i := 0; i < len(nums); i++ {//         m[nums[i]] += 1//     }//     res := make([]int, 0)//     for i := 1; i <= len(nums); i++ {//         if _, ok := m[i]; !ok {//             res = append(res, i)//         }//     }//     return res// }// 方法2,参考:https://www.bilibili.com/video/BV1L34y1j7Rp/?spm_id_from=333.337.search-card.all.click&vd_source=2c268e25ffa1022b703ae0349e3659e4// 本质上是把原数组上对应index的值取负来标识某个值是否出现过// 空间复杂度:O(1)funcfindDisappearedNumbers(nums []int) []int {
fori :=0; i<len(nums); i++ {
nums[MyAbs(nums[i])-1] = (-1) *MyAbs(nums[MyAbs(nums[i])-1]) // 下标从0开始,所以要减一操作    }
res :=make([]int, 0)
fori :=0; i<len(nums); i++ {
ifnums[i] >0 {
res=append(res, i+1)
        }
    }
returnres}
funcMyAbs(aint) int {
ifa<0 {
a*=-1    }
returna}

image.gif


目录
相关文章
|
4天前
|
存储 算法 C语言
找到数组位置
找到数组位置
|
6月前
消失的数字
消失的数字
22 0
|
7月前
【Leetcode -441.排列硬币 -448.找到所有数组中消失的数字】
【Leetcode -441.排列硬币 -448.找到所有数组中消失的数字】
26 0
|
4天前
|
C语言
【05】消失的数字
【05】消失的数字
|
4天前
每日一题——找到消失的数字
每日一题——找到消失的数字
|
4天前
|
索引
leetcode-448:找到所有数组中消失的数字
leetcode-448:找到所有数组中消失的数字
17 0
|
10月前
解 消失的数字
解 消失的数字
|
6月前
448.找到所有数组中消失的数字
448.找到所有数组中消失的数字
|
6月前
|
存储
LeetCode题:88合并两个有序数组,283移动零,448找到所有数组中消失的数字
LeetCode题:88合并两个有序数组,283移动零,448找到所有数组中消失的数字
49 0
|
存储 算法 Java
算法打卡Day5_lecode_448. 找到所有数组中消失的数字
算法打卡Day5_lecode_448. 找到所有数组中消失的数字
算法打卡Day5_lecode_448. 找到所有数组中消失的数字