LeetCode 1094. 拼车

题目

思路

  读完题干后一个自然的思路就是模拟汽车的行驶过程,汽车行驶过程中会顺序经过每个站点,因此现将原数组按乘客上车地点升序排列。之后遍历数组,在遍历过程中每经过一个站点,就需要统计从上一站到该站下车的旅客有多少,先将下车的乘客数补回空座位,然后再判断当前站乘客是否能全部上车。统计下车乘客时有两种方法:一是遍历该站之前的所有站,对于还未处理过的站,判断当前上车地点是否已经过了该站对应的下车地点,这个算法的时间复杂度为O(n^{2})。代码如下所示:

class Solution:
    def carPooling(self, trips: List[List[int]], capacity: int) -> bool:
        trips.sort(key=lambda x:x[1])
        flag=True
        vis=[False for i in range(len(trips))]   #标记每个站是否已经处理过
        q=[]
        start=0
        for i,temp in enumerate(trips):
            start=temp[1]
            for j in range(i):
                if not vis[j]:
                    if trips[j][2]<=start:       #如果当前站已经过了之前某一站乘客的下车地点
                        capacity+=trips[j][0]
                        vis[j]=True
            if capacity<temp[0]:
                return False
                break
            capacity-=temp[0]
        return True

  在统计下车乘客时另一种更高效的方法是使用小根堆。将每一站乘客的下车地点和乘客人数作为堆的元素,并按下车地点排序,这样堆的第一个元素的下车地点就是最早下车的乘客的下车地点。循环判断直到当前堆的第一个元素大于当前距离,该算法的平均时间复杂度为O(n\log(n))代码如下:

  

class Solution:
    def carPooling(self, trips: List[List[int]], capacity: int) -> bool:
        trips.sort(key=lambda x:x[1])
        flag=True
        ##vis=[False for i in range(len(trips))]
        q=[]
        start=0
        for i,temp in enumerate(trips):
            start=temp[1]
            while q:
                if q[0][0]<=start:
                    capacity+=q[0][1]
                    heapq.heappop(q)
                else:
                    break
            if capacity<temp[0]:
                return False
                break
            capacity-=temp[0]
            heapq.heappush(q,[temp[2],temp[0]])
        return True

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值