• Python练习题:找到列表中消失的所有数字


    题目

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

    注意:时间复杂度不能超过 O(n)。

    例如:

    给定一个列表:[4, 3, 2, 7, 8, 2, 3, 1],返回结果:[5, 6]

    给定一个列表:[1, 1],返回结果:[2]

    实现思路1

    • 设置一个列表res,用于存放没有出现在 nums 中的元素

    • 设置一个集合tmp_set,用于存放 nums 中的不重复元素

    • 遍历区间 [1, n]范围内的所有元素,每次用操作符 in 判断当前元素是否在 tmp_set 中,如果不在则添加到 res

    因为题目中限制了 时间复杂度 不得高于 O(n),如果上面用 in 判断是否在列表 nums 中,list下查找元素的时间复杂度为 O(n),那么最终时间复杂度将是 O(n^2) ;

    而用 in 判断是否在集合 tmp_set 中,set下查找元素的时间复杂度为 O(1),那么最终时间复杂度是 O(n) 。
    代码实现

    def findDisappearedNumbers(nums):
        res = []
        tmp_set = set(nums)
        for i in range(1, len(nums) + 1):
            if i not in tmp_set:
                res.append(i)
        return res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    上面解题方法中,因为我们使用了 set集合 ,最终空间复杂度是 O(n),如果在不考虑返回列表的空间复杂度情况下,有没有方法能够把空间复杂度优化为 O(1) 呢?

    接下来的方法,时间复杂度是 O(n) ,空间复杂度是 O(1) 。

    实现思路2

    遍历nums的所有元素,每次把nums在 [1,n] 下标范围内出现过的处理为负数
    遍历结束后,nums中大于 0 的所有元素所处的位置,即 下标 + 1 就是所求的在 [1, n] 范围内,但没有出现在 nums 中的数字

    说明:

    举个例子,最初 nums=[4, 3, 2, 7, 8, 2, 3, 1],如果当前元素为 4 ,那么就把nums中第 4 个元素处理为负数,即 nums=[4, 3, 2, -7, 8, 2, 3, 1]

    以此类推,最终 nums=[-4, -3, -2, -7, 8, 2, -3, -1],可以看到 第 5 个元素和 第 6 个元素 都是大于 0 的,那么就说明 5 和 6 都是 所有在 [1, n] 范围内但没有出现在 nums 中的数字。

    所以最终得到返回结果:[5, 6]

    代码实现

    '''
    学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
    寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
    '''
    def findDisappearedNumbers(nums):
        for i in range(len(nums)):
            index = abs(nums[i]) - 1
            nums[index] = -abs(nums[index])
        res = [i + 1 for i, num in enumerate(nums) if num > 0]
        return res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    代码随想录刷题day14|二叉树的理论基础&二叉树的前中后序递归遍历
    矩阵分析与应用
    macos 上彻底卸载 DevEco Studio
    UTONMOS:AI+Web3+元宇宙数字化“三位一体”将触发经济新爆点
    2022年第三季度泛出行行业洞察:泛出行行业正在经历数智化升级的关键时期,用户规模保持平稳增长,行业整体良性发展
    ubuntu安装最新版本的go基于官网二进制
    SpringBoot+MySQL+Vue前后端分离的宠物领养救助管理系统(附论文)
    STM32 BSRR BRR ODR 寄存器解析(F4系列已经去掉BRR寄存器了)
    使用Python进行Base64编码和解码
    MySQL -- 库和表的操作
  • 原文地址:https://blog.csdn.net/qdPython/article/details/126196033