一个下午琢磨的差分数组
作者:互联网
文章目录
前言
为什么没能写中兴捧月讷? 因为小编并未进复赛。来年再战,反正还有大把时光。
一、什么时候选择差分数组
在刷题总结的过程中,我感觉差分数组借用了Hash算法的思想。此类题目一般分为以下步骤
- 建立差分数组
- 根据提供数组用类似hash的算法进行航班/年份/路口等的建表
- 计算前缀和,根据需要处理
二、例题
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