其他分享
首页 > 其他分享> > 一个下午琢磨的差分数组

一个下午琢磨的差分数组

作者:互联网

文章目录


前言

为什么没能写中兴捧月讷? 因为小编并未进复赛。来年再战,反正还有大把时光。

一、什么时候选择差分数组

在刷题总结的过程中,我感觉差分数组借用了Hash算法的思想。此类题目一般分为以下步骤

  1. 建立差分数组
  2. 根据提供数组用类似hash的算法进行航班/年份/路口等的建表
  3. 计算前缀和,根据需要处理

二、例题

1.370 区间加法

代码如下:

#超时
class Solution(object):
    def getModifiedArray(self, length, updates):
        n= length;
        res=[0]*n;
        for i in updates:
            for j in range(i[0],i[1]+1):
                res[j]+=i[2];
        return res;

#超时
class Solution(object):
    def getModifiedArray(self, length, updates):
        #定义差分数组
        res=[0]*length;
        delta=[0]*(length+1);
        for a,b,c in updates:
            delta[a]+=c;
            delta[b+1]-=c;
        for i in range(length):
            res[i]+=sum(delta[:i+1]);
        return res;

class Solution:
    def getModifiedArray(self, length , updates):
        #差分数组
        res = [0] * (length + 1)
        #数组con
        for i, j, x in updates:
            res[i] += x
            res[j+1] -= x
        #前缀和
        for i in range(1,length):
            res[i] += res[i-1]
        return res[:-1]

2.1854 人口最多的年份

代码如下:

class Solution:
    def maximumPopulation(self, logs: List[List[int]]) -> int:
        delta = [0] * 101   # 变化量
        offset = 1950   # 起始年份与起始下标之差
        for b, d in logs:
            delta[b-offset] += 1
            delta[d-offset] -= 1
        mx = 0   # 人口数量最大值
        res = 0   # 最大值对应的最小下标
        curr = 0   # 每一年的人口数量
        # 前缀和
        for i in range(101):
            curr += delta[i]
            if curr > mx:
                mx = curr
                res = i
        return res + offset   # 转回对应的年份

3. 1094拼车

代码如下:


class Solution(object):
    def carPooling(self, trips, capacity):
        n=0;
        for i in range(len(trips)):
            if trips[i][2]>n:
                n=trips[i][2];

        #定义差分数组
        res=[0]*(n+1);
        for a,b,c in trips:
            res[b]+=a;
            res[c]-=a;
        for i in range(1,n):
            res[i]+=res[i-1];
            if res[i]>capacity:
                return False;
        return  True;

#trips.sort(key=lambda x: x[1])
class Solution(object):
    def carPooling(self, trips, capacity):
        trips.sort(key=lambda x: x[2]);
        n=trips[-1][2];
        #定义差分数组
        res=[0]*(n+1);
        for a,b,c in trips:
            res[b]+=a;
            res[c]-=a;
        for i in range(1,n):
            res[i]+=res[i-1];
            if res[i]>capacity:
                return False;
        return  True;

4. 航班预订统计

代码如下:


class Solution(object):
    def corpFlightBookings(self, bookings, n):
        #差分数组
        res=[0]*(n+1);
        for a,b,c in bookings:
        #理解offset =1 ; 航班从 1 开始编号;
            res[a-1]+=c;
        #res[b+1-1]-=c;
            res[b]-=c;
        #类似于前缀和计算
        for i in range(1,len(res)):
            res[i]+=res[i-1];
        return res[:-1];

总结

差分数组系列题目的解题方法相对固定。大家coding起来吧!小编退下,回去项目赶工啦!

标签:return,res,琢磨,差分,length,数组,trips
来源: https://blog.csdn.net/qq_38823180/article/details/116863697