力扣每日一题+python知识点回顾(七)
力扣题目:拼车(题号: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