题目描述
思路解析动画文字版
思路一句话:按起点从近到远排,算各车到终点的时间,用栈存车队到达时间;更慢就新车队入栈,更快会被合并。下面一步步演给你看。
轮到这辆车(按起点从近到远)。先算它单独跑到终点要多久——时间越大跑得越慢。
前面还没有车队,它就是第一个车队的领头车,记下它的到达时间。
轮到这辆车(按起点从近到远)。先算它单独跑到终点要多久——时间越大跑得越慢。
它到得比前面那个车队还晚,说明更慢、到终点前都追不上 → 它独立成一个新车队,到达时间压栈。
轮到这辆车(按起点从近到远)。先算它单独跑到终点要多久——时间越大跑得越慢。
它到得比前面车队早(更快),会在终点前追上前车、被迫降速跟队 → 并入前车队,栈不变。
轮到这辆车(按起点从近到远)。先算它单独跑到终点要多久——时间越大跑得越慢。
它到得比前面那个车队还晚,说明更慢、到终点前都追不上 → 它独立成一个新车队,到达时间压栈。
轮到这辆车(按起点从近到远)。先算它单独跑到终点要多久——时间越大跑得越慢。
它到得比前面车队早(更快),会在终点前追上前车、被迫降速跟队 → 并入前车队,栈不变。
轮到这辆车(按起点从近到远)。先算它单独跑到终点要多久——时间越大跑得越慢。
它到得比前面车队早(更快),会在终点前追上前车、被迫降速跟队 → 并入前车队,栈不变。
轮到这辆车(按起点从近到远)。先算它单独跑到终点要多久——时间越大跑得越慢。
它到得比前面那个车队还晚,说明更慢、到终点前都追不上 → 它独立成一个新车队,到达时间压栈。
轮到这辆车(按起点从近到远)。先算它单独跑到终点要多久——时间越大跑得越慢。
它到得比前面车队早(更快),会在终点前追上前车、被迫降速跟队 → 并入前车队,栈不变。
轮到这辆车(按起点从近到远)。先算它单独跑到终点要多久——时间越大跑得越慢。
它到得比前面车队早(更快),会在终点前追上前车、被迫降速跟队 → 并入前车队,栈不变。
轮到这辆车(按起点从近到远)。先算它单独跑到终点要多久——时间越大跑得越慢。
它到得比前面那个车队还晚,说明更慢、到终点前都追不上 → 它独立成一个新车队,到达时间压栈。
轮到这辆车(按起点从近到远)。先算它单独跑到终点要多久——时间越大跑得越慢。
它到得比前面车队早(更快),会在终点前追上前车、被迫降速跟队 → 并入前车队,栈不变。
所有车按起点从近到远扫完,栈里残留 5 个到达时间,就是 5 个车队。
边界先想清。
两个高频追问。
参考代码
def carFleet(target, position, speed): cars = sorted(zip(position, speed), reverse=True) # 按起点从近到远 stack = [] # 各车队领头车的到达时间 for p, s in cars: t = (target - p) / s if not stack or t > stack[-1]: # 比前车队慢 → 新车队 stack.append(t) # 否则 t <= 栈顶:追上前车队,合并,不入栈 return len(stack)复杂度
- 时间:O(n log n),排序主导;之后一次线性扫描,每辆车只判断一次
- 空间:O(n),排序索引 + 到达时间栈
易错点
面试追问把动画讲成自己的话
追问为什么用到达时间而不是位置来判断合并?
追问到达时间相等算一个车队还是两个?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
柱状图中最大的矩形
LeetCode 84 · 困难 · 沿着 栈 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题