定义
对于数组 A[n]
,它的差分数组为:
d
i
f
f
[
i
]
=
{
A
[
i
]
,
i
=
=
0
A
[
i
]
−
A
[
i
−
1
]
,
0
<
i
<
n
diff[i]=\begin{cases} A[i],&i==0 \\ A[i]-A[i-1],&0<i<n \end{cases}
diff[i]={A[i],A[i]−A[i−1],i==00<i<n
显然,通过差分数组 diff[n]
,可以求得 A[n]
中的某一具体元素:
A
[
i
]
=
{
d
i
f
f
[
i
]
,
i
=
=
0
d
i
f
f
[
i
]
+
A
[
i
−
1
]
,
0
<
i
<
n
A[i]=\begin{cases} diff[i],&i==0 \\ diff[i]+A[i-1],&0<i<n \end{cases}
A[i]={diff[i],diff[i]+A[i−1],i==00<i<n
应用
- 数组
A[n]
从下标j
开始的元素,都增加v
。(即A[j, j+1, ..., n-1] += v
)
d i f f [ j ] = d i f f [ j ] + v diff[j]=diff[j]+v diff[j]=diff[j]+v - 数组
A[n]
在区间[L, R]
内的元素,都增加v
。(即A[L, L+1, ..., R] += v
)
{ d i f f [ L ] = d i f f [ L ] + v d i f f [ R + 1 ] = d i f f [ R + 1 ] − v \begin{cases} diff[L]=diff[L]+v \\ diff[R+1]=diff[R+1]-v \end{cases} {diff[L]=diff[L]+vdiff[R+1]=diff[R+1]−v - 数组
A[n]
中的某一元素A[j]
增加v
。
{ d i f f [ j ] = d i f f [ j ] + v d i f f [ j + 1 ] = d i f f [ j + 1 ] − v \begin{cases} diff[j] = diff[j]+v \\ diff[j+1]=diff[j+1]-v \end{cases} {diff[j]=diff[j]+vdiff[j+1]=diff[j+1]−v
例题
int* corpFlightBookings(int** bookings, int bookingsSize, int* bookingsColSize, int n, int* returnSize) {
int *ret = (int*)calloc(n, sizeof(int));
memset(ret, 0, n * sizeof(int));
for (int i = 0; i < bookingsSize; i++)
{
for (int j = bookings[i][0] - 1; j < bookings[i][1]; j++)
{
ret[j] += bookings[i][2];
}
}
*returnSize = n;
return ret;
}
差分数组
int* corpFlightBookings(int** bookings, int bookingsSize, int* bookingsColSize, int n, int* returnSize) {
int *ret = (int*)calloc(n, sizeof(int)), *diff = (int*)calloc(n, sizeof(int));
memset(ret, 0, n * sizeof(int));
memset(diff, 0, n * sizeof(int));
*returnSize = n;
for (int i = 0; i < bookingsSize; i++)
{
diff[bookings[i][0] - 1] += bookings[i][2];
if (bookings[i][1] < n)
diff[bookings[i][1]] -= bookings[i][2];
}
ret[0] = diff[0];
for (int i = 1; i < n; i++)
ret[i] = diff[i] + ret[i - 1];
return ret;
}
完