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 = 0
和 x ⊕ 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(nlogn)
- 空间复杂度: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
参考链接:丑数;丢失的数字
分类:
Python
, LeetCode - 数据库
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2019-03-17 MySQL学习笔记:select语句性能优化建议