[LeetCode解题报告] 1094. 拼车

该博客介绍了一种利用线段树解决LeetCode上的1094题——拼车问题的方法。作者通过分析题目,提出了将问题转化为区间最大值查询(IUPQ)的思路,并给出了线段树的实现代码。文章详细解释了代码的逻辑,并指出此问题也可用差分数组解决。最后,提供了解题小结及参考链接。
摘要由CSDN通过智能技术生成

一、 题目

1. 题目描述

车上最初有 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 <= trips.length <= 1000
  • trips[i].length == 3
  • 1 <= numPassengersi <= 100
  • 0 <= fromi < toi <= 1000
  • 1 <= capacity <= 105
Related Topics
  • 数组
  • 前缀和
  • 排序
  • 模拟
  • 堆(优先队列)

  • 👍 182
  • 👎 0

2. 原题链接

链接: 1094. 拼车

二、 解题报告

1. 思路分析

trip的作用:某个路程点上一部分人,某个路程点下一部分人。在这个区间,这些人会一直在车上。
那么其实就是IUPQ,用线段树询问所有区间的max就行

2. 复杂度分析

最坏时间复杂度O(nlog2n)

3. 代码实现

线段树

class IntervalTree:
    def __init__(self):
        self.interval_tree = collections.defaultdict(int)
        self.lazys = collections.defaultdict(int)        

    def give_lay_to_son(self,p,l,r):
        interval_tree = self.interval_tree
        lazys = self.lazys
        if lazys[p] == 0:
            return
        mid = (l+r)//2
        interval_tree[p*2] += lazys[p]
        interval_tree[p*2+1] += lazys[p]
        lazys[p*2] += lazys[p]
        lazys[p*2+1] += lazys[p]
        lazys[p] = 0
        
    def add(self,p,l,r,x,y,val):
        """
        把[x,y]区域全+val
        """
        if r < x or y < l:  # 这里不加就会TLE
            return 
        interval_tree = self.interval_tree    
        lazys = self.lazys        
        if x <= l and r<=y:
            interval_tree[p] += val
            lazys[p] += val
            return
        self.give_lay_to_son(p,l,r)  
        mid = (l+r)//2
        if x <= mid:
            self.add(p*2,l,mid,x,y,val)
        if mid < y:
            self.add(p*2+1,mid+1,r,x,y,val)
        interval_tree[p] = max(interval_tree[p*2], interval_tree[p*2+1]) 
    
    def query(self,p,l,r,x,y):
        """
        查找x,y区间的最大值
        """        
        if x<=l and r<=y:
            return self.interval_tree[p]
        self.give_lay_to_son(p,l,r)
        mid = (l+r)//2
        s = 0
        if x <= mid:
            s = max(s,self.query(p*2,l,mid,x,y))
        if mid < y:
            s = max(s,self.query(p*2+1,mid+1,r,x,y))
        return s

class Solution:
    def carPooling(self, trips: List[List[int]], capacity: int) -> bool:
        tree = IntervalTree()
        for numPassengers,from_,to in trips:
            tree.add(1,1,1005,from_+1,to,numPassengers)
            if tree.interval_tree[1] > capacity:
                return False
        return True

三、 本题小结

  1. 线段树的IUPQ模型,这也可以用差分数组做。

四、 参考链接

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值