LeetCode 1603. 设计停车系统

125 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第22天,点击查看活动详情

LeetCode 1603. 设计停车系统

一、题目描述:

请你给一个停车场设计一个停车系统。停车场总共有三种不同大小的车位:大,中和小,每种尺寸分别有固定数目的车位。

请你实现 ParkingSystem 类:

ParkingSystem(int big, int medium, int small) 初始化 ParkingSystem 类,三个参数分别对应每种停车位的数目。 bool addCar(int carType) 检查是否有 carType 对应的停车位。 carType 有三种类型:大,中,小,分别用数字 1, 2 和 3 表示。一辆车只能停在 carType 对应尺寸的停车位中。如果没有空车位,请返回 false ,否则将该车停入车位并返回 true 。

示例 1:

输入:

["ParkingSystem", "addCar", "addCar", "addCar", "addCar"]

[[1, 1, 0], [1], [2], [3], [1]]

输出:

[null, true, true, false, false]

解释: ParkingSystem parkingSystem = new ParkingSystem(1, 1, 0);

parkingSystem.addCar(1); // 返回 true ,因为有 1 个空的大车位

parkingSystem.addCar(2); // 返回 true ,因为有 1 个空的中车位

parkingSystem.addCar(3); // 返回 false ,因为没有空的小车位

parkingSystem.addCar(1); // 返回 false ,因为没有空的大车位,唯一一个大车位已经被占据了

提示:

0 <= big, medium, small <= 1000

carType 取值为 1, 2 或 3

最多会调用 addCar 函数 1000 次

来源:力扣(LeetCode)

链接:leetcode.cn/problems/de…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

  1. 这道题考察了什么思想?你的思路是什么?

    这道题目主要是考察停车位的数量问题,主要是判断大小。

    因为每次调用addCar(carType),都要在对应停车位数量切片的值减一,如果没有剩余车位,就无法停车,返回false,如果能够减一,就在减一操作后返回true。

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

  2. 做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

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

    type ParkingSystem struct {
        left [4]int
    }
    ​
    func Constructor(big, medium, small int) ParkingSystem {
        return ParkingSystem{[4]int{0, big, medium, small}}
    }
    ​
    func (s *ParkingSystem) AddCar(carType int) bool {
        if s.left[carType] > 0 {
            s.left[carType]--
            return true
        }
        return false
    }
    
  3. 有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

    class ParkingSystem {
        int big, medium, small;
        public ParkingSystem(int _big, int _medium, int _small) {
            big = _big; 
            medium = _medium; 
            small = _small;
        }
        
        public boolean addCar(int ct) {
            if (ct == 1 && big > 0) return big-- > 0;
            else if (ct == 2 && medium > 0) return medium-- > 0;
            else if (ct == 3 && small > 0) return small-- > 0;
            return false;
        }
    }
    ​
    作者:AC_OIer
    链接:https://leetcode.cn/problems/design-parking-system/solution/yi-ti-san-jie-jian-dan-bian-liang-ha-xi-0gs72/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

三、AC 代码:

type ParkingSystem struct {
    park [3]int
}
​
​
func Constructor(big int, medium int, small int) ParkingSystem {
    return ParkingSystem{[3]int{big,medium,small}}
}
​
​
func (this *ParkingSystem) AddCar(carType int) bool {
    if this.park[carType - 1] > 0{
        this.park[carType - 1]--
        return true
    }
    return false
}
​
​
/**
 * Your ParkingSystem object will be instantiated and called as such:
 * obj := Constructor(big, medium, small);
 * param_1 := obj.AddCar(carType);
 */

执行用时:36 ms, 在所有 Go 提交中击败了75.23%的用户

内存消耗:7 MB, 在所有 Go 提交中击败了92.66%的用户

通过测试用例:102 / 102

四、总结:

这是一道十分简单的题目,应该大部分人都能一次过吧~

模板来源

作者:掘金酱

链接:juejin.cn/post/706970…

来源:稀土掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。