§1
题目描述
长度 n 的数组包含 0..n 中缺一个数,找出缺失值。
nums = [3,0,1]
输出 = 2
§2
思路解析动画文字版
关键不是背模板,而是看懂为什么这题适合数学 / 异或。
1. 完整范围少了一个:数组是 0..n 里少了一个数。n=3,完整范围 0,1,2,3 共 n+1=4 个,数组只有 3 个,缺的就是没出现的那个。
2. 完整和 = 6:先算完整和:0+1+2+3=6(公式 n(n+1)/2)。
3. 实际和 = 4:再算数组实际和:3+0+1=4。
4. 关键帧 · 两个和之差 = 缺失数:关键帧:完整和里多算的正好是缺失的那个数。6 − 4 = 2 → 答案 2。一遍求和、O(1) 空间。
5. 替代法 · 全员异或:更稳的替代法:把 0..n 和数组全部异或。出现过的数各异或两次、成对变 0,只剩缺失的 2。异或不会像求和那样溢出。
把这句话记住,下次遇到同类题,就能更快选出方向。
边界三连:边界三连:极端输入先过一遍。
几个高频追问,记住答法。
§3
参考代码
class Solution: def missingNumber(self, nums): n = len(nums) return n * (n + 1) // 2 - sum(nums) # 完整和 - 实际和看懂代码不等于写得出。盖住上面,自己默写一遍试试。卡在哪一行说不清,就点右下角问小欧。
§4
复杂度
- 时间复杂度:O(n),遍历数组一次求和(或一遍异或)
- 空间复杂度:O(1),无额外结构,只用几个整型累加
§5
可套用的代码模板
两种都行:求和差直观、异或防溢出。
Python
# 缺失数字骨架(两种 O(1) 空间法)# 法1 求和差:return n*(n+1)//2 - sum(nums)# 法2 异或(不会溢出):x = 0for i in range(n+1): x ^= ifor v in nums: x ^= vreturn x§6
易错点
✗ 错误写法:范围只加到 n-1
✓ 正确写法:完整范围是 0..n,一共 n+1 个数
缺的可能正好是 n
✗ 错误写法:大 n 求和溢出
✓ 正确写法:改用异或法,或边加边减
n 很大时 n(n+1)/2 可能超出 int;异或法天然不溢出。
✗ 错误写法:变量名和动画不一致
✓ 正确写法:代码变量沿用动画里的核心名字
学习时最怕脑内维护两套概念
§
面试追问把动画讲成自己的话
追问异或和求和差怎么选?
都 O(n)、O(1)。异或不会溢出更安全;求和差更直观但大数可能溢出。
追问为什么异或能找缺失数?
把 0..n 和数组一起异或,每个出现的数恰好两次(成对消失),只有缺失的在 0..n 出现一次、留下。
追问和「只出现一次 LC136」的联系?
同一招异或消对;本题把完整序列 0..n 和数组一起异或,缺的那个落单。
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
下一题 · 位运算 6/8
→两整数之和
LeetCode 371 · 中等 · 沿着 位运算 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
299道动画图解
37节语音讲解
28课数据结构
¥0.27折合 / 天
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
¥99 开通年卡 →
想成体系刷透这类套路?去图解算法专题