Python学习笔记:丢失的数字

一、题目

给定一个包含 [0, n] 中 n 个数的数组 nums,找出 [0, n] 这个范围内没有出现在数组中的那个数。

二、思路

1.方法一:排序

将数组排序之后,即可根据数组中每个下标处的元素是否和下标相等,得到丢失的数字。

2.方法二:哈希集合

使用哈希集合,可以将时间复杂度降低到 O(n)。

首先遍历数组 nums,将数组中的每个元素加入哈希集合,然后依次检查从 0 到 n 的每个整数是否在哈希集合中,不在哈希集合中的数字即为丢失的数字。

3.方法三:求和作差

对列表进行求和,与1到n项的数列和进行对比,其差则是所缺的数。

4.方法四:求和作差、边加边减

基于方法三改进,直接将所有数相加存在溢出风险,可以进行边加边减。

貌似该题目不存在这种溢出问题,不尝试实操了。

5.方法五:位运算

在数组后添加 0~n 的每个整数,一共 2n+1 个整数。

根据出现的次数的奇偶性,可以使用按位异或运算得到丢失的数字。

按位异或运算 ⊕ 满足交换律和结合律,且对任意整数 x 都满足:

x ⊕ x = 0x ⊕ 0 = x

由于上述 2n+1 个整数中,丢失的数字出现一次,其余的数字都出现两次,因此对上述 2n+1 个整数进行按位异或运算,结果即为丢失的数字。

三、实操

1.方法一:排序

# 排序
class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        nums.sort()
        for i, v in enumerate(nums):
            if i != v:
                return i
        return len(nums) # 缺失n

复杂度分析

  • 时间复杂度:O(nlog⁡n)
  • 空间复杂度:O(logn) 空间复杂度主要取决于排序的递归调用栈空间。

2.方法二:哈希集合

# 哈希集合
class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        s = set(nums)
        for i in range(len(nums)+1):
            if i not in s:
                return i

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

3.方法三:求和作差

# 求和作差(公式)
class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        return int(len(nums) * (len(nums) + 1) / 2 - sum(nums))

# 非公式    
class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        return sum(list(range(len(nums) + 1))) - sum(nums)

4.方法四:位运算

# 位运算
class Solution:
    def missingNumber(self, nums) -> int:
        xor = 0
        for i, num in enumerate(nums):
            xor ^= i ^ num
        return xor ^ len(nums)

nums = [1,2,0,4]
Solution().missingNumber(nums) # 3

参考链接:丑数;丢失的数字

posted @   Hider1214  阅读(288)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2019-03-17 MySQL学习笔记:select语句性能优化建议
点击右上角即可分享
微信分享提示