一、算法简介
差分其实就是数据之间的差,什么数据的差呢?就是上面所给的原始数组的相邻元素之间的差值,我们令 d[i]=a[i+1]-a[i],一遍for循环即可将差分数组求出来。其实差分数组是一个辅助数组,从侧面来表示给定某一数组的变化,一般用来对数组进行区间修改的操作。
二、相关例题
此类题目比较简单,只需要注意边界的位置即可。
1. leetcode 1094
【解题思路】
遍历trips数组构造差分数组,trip的开始处增加该站上的人数,同时在trip的结束处减去相应的人数。
【代码】
class Solution(object):
def carPooling(self, trips, capacity):
"""
:type trips: List[List[int]]
:type capacity: int
:rtype: bool
"""
auxiliary_array = [0] * 2000
max_station = 0
for i in range(len(trips)):
trip = trips[i]
people_num = trip[0]
auxiliary_array[trip[1]] += people_num
auxiliary_array[trip[2]] -= people_num
if max_station < trip[2]:
max_station = trip[2]
left_seats = capacity
for i in range(max_station):
left_seats = left_seats - auxiliary_array[i]
if left_seats < 0:
return False
return True
2. leetcode 1109
【解题思路】
同样的,遍历bookings数组每一个item,item中的数量,在第一个位置加,加第二个位置+1减去数组,构造差分数组。
【代码】
class Solution(object):
def corpFlightBookings(self, bookings, n):
"""
:type bookings: List[List[int]]
:type n: int
:rtype: List[int]
"""
aux_array = [0] * (n + 1)
for i in range(len(bookings)):
book = bookings[i]
if 1 <= book[0] and book[0] <= n:
aux_array[book[0]] += book[2]
if 1 <= book[1] and (book[1] + 1) <= n:
aux_array[book[1]+1] -= book[2]
for i in range(1, len(aux_array)):
aux_array[i] = aux_array[i] + aux_array[i-1]
aux_array.pop(0)
return aux_array