题目描述
思路解析动画文字版
记住三个计数器:大车位余量、中车位余量、小车位余量。来车只动它自己那一种,大于 0 就减一停入,等于 0 就拒绝。
停车场开张:大车位 2 个、中车位 2 个、小车位 2 个。三个计数器各记各的,等车来。
来了一辆大车(carType=1)。只看大车位这一个计数器,现在余量是 2,看它还大不大于 0。
大车位余量 2 大于 0,有空位:停进去,余量减一变成 1,返回 true。其它两种车位纹丝不动。
来了一辆中车(carType=2)。只看中车位这一个计数器,现在余量是 2,看它还大不大于 0。
中车位余量 2 大于 0,有空位:停进去,余量减一变成 1,返回 true。其它两种车位纹丝不动。
来了一辆小车(carType=3)。只看小车位这一个计数器,现在余量是 2,看它还大不大于 0。
小车位余量 2 大于 0,有空位:停进去,余量减一变成 1,返回 true。其它两种车位纹丝不动。
来了一辆大车(carType=1)。只看大车位这一个计数器,现在余量是 1,看它还大不大于 0。
大车位余量 1 大于 0,有空位:停进去,余量减一变成 0,返回 true。其它两种车位纹丝不动。
来了一辆大车(carType=1)。只看大车位这一个计数器,现在余量是 0,看它还大不大于 0。
大车位余量已经是 0,没空位了:这辆车停不下,余量保持 0,返回 false。
来了一辆中车(carType=2)。只看中车位这一个计数器,现在余量是 1,看它还大不大于 0。
中车位余量 1 大于 0,有空位:停进去,余量减一变成 0,返回 true。其它两种车位纹丝不动。
来了一辆小车(carType=3)。只看小车位这一个计数器,现在余量是 1,看它还大不大于 0。
小车位余量 1 大于 0,有空位:停进去,余量减一变成 0,返回 true。其它两种车位纹丝不动。
来了一辆小车(carType=3)。只看小车位这一个计数器,现在余量是 0,看它还大不大于 0。
小车位余量已经是 0,没空位了:这辆车停不下,余量保持 0,返回 false。
来了一辆中车(carType=2)。只看中车位这一个计数器,现在余量是 0,看它还大不大于 0。
中车位余量已经是 0,没空位了:这辆车停不下,余量保持 0,返回 false。
来了一辆大车(carType=1)。只看大车位这一个计数器,现在余量是 0,看它还大不大于 0。
大车位余量已经是 0,没空位了:这辆车停不下,余量保持 0,返回 false。
来了一辆小车(carType=3)。只看小车位这一个计数器,现在余量是 0,看它还大不大于 0。
小车位余量已经是 0,没空位了:这辆车停不下,余量保持 0,返回 false。
11 辆车依次处理完毕:成功停入 6 辆、因满拒绝 5 辆。三个计数器最终余量就是各车位的剩余空位。
三个高频追问:为什么计数器就够、如何支持释放车位、数组索引 vs if 分支。
参考代码
class ParkingSystem: def __init__(self, big, medium, small): # 三个独立计数器,记各车位余量 self.rem = [0, big, medium, small] # 按 carType 索引 def addCar(self, carType: int) -> bool: if self.rem[carType] > 0: # 还有空位 self.rem[carType] -= 1 # 停入,减一 return True return False # 满了,拒绝复杂度
- 时间:O(1),每次 addCar 只读一次、改一次对应计数器,与车位数量无关
- 空间:O(1),只存大/中/小三个计数器,固定三格
易错点
面试追问把动画讲成自己的话
追问为什么这题用三个计数器就够了,不用真的建一个停车场矩阵?
追问如果还要支持「车开走、释放车位」呢?
追问用数组按 carType 索引和写三个 if 有什么区别?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
LRU 缓存
LeetCode 146 · 中等 · 沿着 设计套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题