差分数组

定义

对于数组 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}\]


应用

  1. 数组 A[n] 从下标 j 开始的元素,都增加 v。(即 A[j, j+1, ..., n-1] += v)

\[diff[j]=diff[j]+v \]

  1. 数组 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}\]

  1. 数组 A[n] 中的某一元素 A[j] 增加 v

\[\begin{cases} diff[j] = diff[j]+v \\ diff[j+1]=diff[j+1]-v \end{cases}\]


例题

LeetCode1109. 航班预订统计
暴力解

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;
}

posted @   ltign  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示