【算法】差分法


【算法】差分法

1、介绍

一般地,差分主要用于让一个序列某一特定范围内的所有值都加上或减去一个常数。

所以差分往往应用于线性的场合,即一维数组的环境,但是除此之外,差分还可以应用于二维数组,但是相比较一维数组,应用的较少。

2、定义

差分可以简单的看成序列中每个元素与其前一个元素的差。

3、差分与前缀和

const int N = 100010;
int n; //n数组长度
//定义两个一维整形数组 a为原数组,b为差分数组
int a[N],b[N];  
​
//根据定义可知
b[i] = a[i] - a[i-1];
//稍微具体
b[1] = a[1];
b[2] = a[2] - a[1];
b[3] = a[3] - a[2];
...
b[i] = a[i] - a[i-1];
​
//转化一下,求数组b的前缀和,根据上面公式可得
  b[1]+b[2]+b[3]+...+b[i]
= a[1]+(a[2]-a[1])+(a[3]-a[2])+...+(a[i]-a[i-1])
= a[i]
​
//由此可知,原序列为差分序列的前缀和序列
a[i] = b[1]+b[2]+b[3]+...+b[i];

 一般地,我们认为原序列就是差分序列的前缀和,所以把差分看做前缀和的逆运算

4、举例通俗理解

上下车的问题
10人在1时上车,3时下车
20人在2时上车,4时下车
25人在2时上车,5时下车
那么,我们用一个数组ans记录车辆人数变化,ans[i]表示在i时刻人数变化,所以:
ans[i]的值为+x,即在i时刻车辆增加x人
ans[i]的值为-x,即在i时刻车辆减少x人
如果要计算某一个时刻的人数,公式为:ans[i-1]+ans[i]

5.练习题

这里有 n 个航班,它们分别从 1 到 n 进行编号。
​
有一份航班预订表 bookings ,表中第 i 条预订记录 bookings[i] = [firsti, lasti, seatsi] 意味着在从 firsti 到 lasti (包含 firsti 和 lasti )的 每个航班 上预订了 seatsi 个座位。
​
请你返回一个长度为 n 的数组 answer,其中 answer[i] 是航班 i 上预订的座位总数。
​
示例 1:
​
输入:bookings = [[1,2,10],[2,3,20],[2,5,25]], n = 5
输出:[10,55,45,25,25]
解释:
航班编号        1   2   3   4   5
预订记录 1 :   10  10
预订记录 2 :       20  20
预订记录 3 :       25  25  25  25
总座位数:      10  55  45  25  25
因此,answer = [10,55,45,25,25]
示例 2:
​
输入:bookings = [[1,2,10],[2,2,15]], n = 2
输出:[10,25]
解释:
航班编号        1   2
预订记录 1 :   10  10
预订记录 2 :       15
总座位数:      10  25
因此,answer = [10,25]

 

class Solution {
    public int[] corpFlightBookings(int[][] bookings, int n) {
        //定义长度为n的数组
        int[] answer = new int[n];
        //遍历数组参数
        for (int[] i:bookings) {
            //对应的数组下标的值增加
            answer[i[0]-1]+=i[2];
            if (i[1]<n) {
                //对应的数组下标的值减少
                answer[i[1]]-=i[2];
            }
        }
        //前缀和
        for (int i = 1; i <answer.length; i++) {
            answer[i]+=answer[i-1];
        }
        return answer;
    }
}

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM