各位题友大家好! 今天是 @负雪明烛 坚持日更的第 54 天。今天力扣上的每日一题是「1603. 设计停车系统」。

解题思路

今天的题目简单到难以置信。

题意:三种停车位:大、中、小,每次调用 addCar(carType) 就需要在对应的车型的停车位增加一辆车,如果该车型没有剩余空位,就无法停车。判断每次调用 addCar 时能否停车。

注意:本题的车位中的车只增加不减少。

用三个变量分别维护各类车型的剩余空位的数目,每次 addCar(carType) 的时候就把对应类型的停车空位数目 - 1。如果当前车型的剩余空位数目 == 0,那么说明无法再停车了,就返回 False;否则说明可以停车,就返回 True。

carType 的取值为 1, 2, 3 ,因此可以使用数组保存停车位的剩余空位数目,根据下标来获取对应车型的停车位剩余数目。这样做的好处是,省了代码行数。

代码

下面的代码中,数组的第 0 位置初始化为 0,其实这是个占位符。目的是获取 carType 对应的停车位剩余空位个数时,直接用 park[carType] ,而不是用 park[carType - 1] ,能减少一个减法的运算。

下面分享了 Python, C++, Java 三种代码。

  1. class ParkingSystem(object):
  2. def __init__(self, big, medium, small):
  3. self.park = [0, big, medium, small]
  4. def addCar(self, carType):
  5. if self.park[carType] == 0:
  6. return False
  7. self.park[carType] -= 1
  8. return True
  1. class ParkingSystem {
  2. public:
  3. ParkingSystem(int big, int medium, int small) {
  4. park = {0, big, medium, small};
  5. }
  6. bool addCar(int carType) {
  7. return park[carType] -- > 0;
  8. }
  9. private:
  10. vector<int> park;
  11. };
  1. class ParkingSystem {
  2. int[] park;
  3. public ParkingSystem(int big, int medium, int small) {
  4. park = new int[]{0, big, medium, small};
  5. }
  6. public boolean addCar(int carType) {
  7. return park[carType] -- > 0;
  8. }
  9. }
  • 时间复杂度: $O(1)$,每次 addCar 操作是 $O(1)$的是时间复杂度。
  • 空间复杂度: $O(1)$,只用了常量个空间。

刷题心得

今天的题目其实可以拓展:
1. 如果允许车离开停车位,该怎么做?
2. 如果允许小车停放在比它更大的停车位上,该怎么做?
3. 如果给每个车增加 id,车离开车位的时候必须按照指定的顺序,比如先进先出,该怎么做?
4. 如果在并发场景的停入和离开车,如何保证结果正确?


OK,以上就是 @负雪明烛 写的今天题解的全部内容了,如果你觉得有帮助的话,求赞、求关注、求收藏。如果有疑问的话,请在下面评论,我会及时解答。

关注我,你将不会错过我的精彩动画题解、面试题分享、组队刷题活动,进入主页 @负雪明烛 右侧有刷题组织,从此刷题不再孤单。

祝大家牛年大吉!AC 多多,Offer 多多!我们明天再见!