LeetCode-【差分解决区间问题】解题技巧

本文介绍了如何利用差分法解决LeetCode中涉及区间问题的题目,如拼车、航班预订统计等。通过初始化车站人数、处理上下车变化、累加车站人数来判断条件。同时,讨论了多个具体题目,包括边界条件的处理,并对比了差分法与其它解法的差异,展示其巧妙之处。
摘要由CSDN通过智能技术生成

1094. 拼车

此题关键在于:上车下车先后是固定的, 那么可以用差分法,在特定车站上车就+人数, 下车就-人数,那么计算, 如果出现 > capacity 就是false;

1.所有车站人数初始化为0;

2.遍历trips,依次维护上下车各车站人数变化;

3.遍历所有车站,累加各个车站人数,出现> > capacity 就是false,否则返回true;

class Solution(object):
    def carPooling(self, trips, capacity):
        """
        :type trips: List[List[int]]
        :type capacity: int
        :rtype: bool
        """
        diff = [0]*1002
        for n,i,j in trips:
            diff[i]+=n
            diff[j]-=n
        curr = 0
        for i in range(1001):
            curr+=diff[i]
            if capacity < curr:
                return False
        return True

1109. 航班预订统计

此题关键在于:此题与上体类似,航班只上座,变化点在于起始航班上座数,所以只需要依次累加就行,所求即为各个航班总上座数。

备注:注意边界条件;

class Solution(object):
    def corpFlightBookings(self, bookings, n):
        """
        :type bookings: List[List[int]]
        :type n: int
        :rtype: List[int]
        """
        diff = [0]*(n+2)
        for f,l,s in bookings:
            diff[f] += s
            diff[l+1] -= s
        ret = []
        curr = 0
        for i in diff[1:-1]:
            curr+=i
            ret.append(curr)
        return ret

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值