差分数组
定义
对于数组 A[n]
,它的差分数组为:
\[diff[i]=\begin{cases}
A[i],&i==0 \\
A[i]-A[i-1],&0<i<n
\end{cases}\]
显然,通过差分数组 diff[n]
,可以求得 A[n]
中的某一具体元素:
\[A[i]=\begin{cases}
diff[i],&i==0 \\
diff[i]+A[i-1],&0<i<n
\end{cases}\]
应用
- 数组
A[n]
从下标j
开始的元素,都增加v
。(即A[j, j+1, ..., n-1] += v
)
\[diff[j]=diff[j]+v
\]
- 数组
A[n]
在区间[L, R]
内的元素,都增加v
。(即A[L, L+1, ..., R] += v
)
\[\begin{cases}
diff[L]=diff[L]+v \\
diff[R+1]=diff[R+1]-v
\end{cases}\]
- 数组
A[n]
中的某一元素A[j]
增加v
。
\[\begin{cases}
diff[j] = diff[j]+v \\
diff[j+1]=diff[j+1]-v
\end{cases}\]
例题
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;
}
完
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具