力扣每日一题+python知识点回顾(七)

发布时间 2023-12-02 22:08:20作者: 风雪无常

力扣题目:拼车(题号:1094)

车上最初有 capacity 个空座位。车 只能 向一个方向行驶(也就是说,不允许掉头或改变方向)

给定整数 capacity 和一个数组 trips , trip[i] = [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi 乘客,接他们和放他们的位置分别是 fromi 和 toi 。这些位置是从汽车的初始位置向东的公里数。

当且仅当你可以在所有给定的行程中接送所有乘客时,返回 true,否则请返回 false。

示例 1:

输入:trips = [[2,1,5],[3,3,7]], capacity = 4
输出:false

示例 2:

输入:trips = [[2,1,5],[3,3,7]], capacity = 5
输出:true

编程思路1:暴力法

先考虑一种暴力破解的思路:统计每个站点最多同时存在的客户数量,最终与座位数相比较,如果每个站点的客户数都小于座位数,则返回true,否则返回flase。

class Solution:
    def carPooling(self, trips: List[List[int]], capacity: int) -> bool:
        num = [0] * 1001
        for i in range(len(trips)):
            for j in range(trips[i][1],trips[i][2]):
                num[j] += trips[i][0]
        
        for i in range(len(diff)):
            if num[i] > capacity:
                return False
        return True

时间复杂度O(n*m),空间复杂度O(m),其中n是旅行次数,m是行程数,本题中:m=1000

编程思路2:差分数组

差分数组通过统计不同站点之间的数据变化,来实现统计,适用对数组进行频繁操作的问题:针对本问题,我们在用差分数组记录不同站点之间的变化:

class Solution:
    def carPooling(self, trips: List[List[int]], capacity: int) -> bool:
        diff = [0] * 1001 # 差分数组
        for numPassengers, from_, to in trips: 
            diff[from_] += numPassengers
            diff[to] -= numPassengers 
        p = mx = 0 
        for x in diff: 
            p += x
            if p > mx: 
				mx = p 
            if mx > capacity: 
				return False 
        return True

时间复杂度O(n+max(trips[i][2])),空间复杂度O(m),其中n是旅行次数,m是行程数,本题中:m=1000