题目描述
思路解析动画文字版
下面 15 步动画会按主解代码推进,而不是泛泛讲题型。
1. 题面 · 区间累加座位:5 个航班初始座位都是 0。三条预订各给一段连续航班加座位,要求返回每个航班最终的总座位数。
2. 暴力会超时 → 用差分:逐个航班加座位最坏要枚举所有航班,太慢。改用长度 n+1=6 的差分数组 diff:每条预订只改两个端点,最后前缀和还原。
3. 预订①[1,2,10] · 起点加:处理第①条 [1,2,10]:first-1=0,在 diff[0] 加上 10,标记这段加座位的起点。
4. 预订①[1,2,10] · 终点减:同一条预订:在 diff[last]=diff[2] 减去 10。这样加座位的影响只覆盖航班 1、2,到第 3 个航班自动停止。
5. 预订②[2,3,20] · 起点加:处理第②条 [2,3,20]:first-1=1,diff[1] 加 20 变成 20,标记新区间的起点。
6. 预订②[2,3,20] · 终点减:diff[last]=diff[3] 减 20。这条预订只影响航班 2、3,端点修改就此完成。
7. 预订③[2,5,25] · 起点加:处理第③条 [2,5,25]:first-1=1,diff[1] 在原有 20 上再加 25,累计成 45。多条预订共用同一端点会自然叠加。
8. 预订③[2,5,25] · 终点减:diff[last]=diff[5] 减 25。三条预订全部落到差分数组上,diff = [10,45,-10,-20,0,-25],端点修改阶段结束。
9. 端点修改完成 · 为何前缀和能还原:三条预订都化成了端点上的加减。差分的本质:在区间起点 +seats、终点后 -seats,对 diff 求前缀和就能还原每个航班的真实座位。
10. 前缀还原 · i=0:对 diff 求前缀和还原。i=0:累计 = 0 + diff[0] = 10,得到航班 1 的总座位 10。
11. 前缀还原 · i=1:i=1:累计 = 上一步 10 + diff[1]=45 = 55。航班 2 被预订①②③同时覆盖,座位最多。
12. 前缀还原 · i=2:i=2:累计 = 55 + diff[2]=-10 = 45。预订①在这里到期,负值把它的 10 个座位减掉。
13. 前缀还原 · i=3:i=3:累计 = 45 + diff[3]=-20 = 25。预订②到期,减掉它的 20 个座位,只剩预订③贡献的 25。
14. 前缀还原 · i=4:i=4:累计 = 25 + diff[4]=0 = 25。预订③覆盖到航班 5,座位维持 25。diff[5] 的 -25 在 n 之外,不进入答案。
15. 收束 · 返回 ans:5 个航班的总座位还原完毕:[10,55,45,25,25]。差分把 m 条区间加法降到 O(n+m),远快于逐航班枚举。
记住这题的代码骨架:题意约束先落到状态变量,再用循环或递归维护它。
参考代码
class Solution: def corpFlightBookings(self, bookings, n): diff = [0] * (n + 1) for first, last, seats in bookings: diff[first - 1] += seats diff[last] -= seats ans = [] cur = 0 for i in range(n): cur += diff[i] ans.append(cur) return ans复杂度
- 时间复杂度:O(n+m),处理预订再前缀还原
- 空间复杂度:O(n),差分数组
易错点
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。再去主线里挑下一道练手。
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题