差分数组算法

差分数组

  1. 适用于对数组某些区间元素频繁的增减问题

  2. 如果是对数组某些区间频繁查询,那就是前缀和问题

  3. 对于差分数组问题,可以定死一个类专门对数组作差分

  4. 如:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3EWxI56N-1653527607058)(C:\Users\lebronHArden\AppData\Roaming\Typora\typora-user-images\image-20220526090517143.png)]

    对上述数组做这些操作:

    a:[1,3]每个元素加2

    b:[2,4]每个元素减3

  5. 如果暴力求解是不一定能过的.


写一个专门做差分的类:

class Difference{
    //差分数组
    private int[] diff;
    //根据给定的数组构造初始化一个差分数组
    public Difference(int[] nums){
        diff=new int[nums.length];
        diff[0]=nums[0];
        for(int i=1;i<diff.length;i++){
            diff[i]=nums[i]-nums[i-1];
        }
    }
    //给[i,j]中的元素都加inc
    public void increment(int i,int j,int inc){
        //inc当然可以为负
        diff[i]+=inc;//这个就表示从[i,...),根据差分数组还原结果数组时元素都+inc了
        //为了只给[i,j]这个局部做加法,我们需要把从[j+1,...)开始减inc
        if(j+1<diff.length){
            diff[j+1]-=inc;
        }
    }

    //根据差分数组拿最终的结果
    public int[] result(){
        int[] res = new int[diff.length];
        res[0]=diff[0];
        for(int i=1;i<res.length;i++){
            res[i]=res[i-1]+diff[i];
        }
        return res;
    }
}

遇到可以使用差分算法做的题,直接把这个类写出来,运用这个工具即可把题搞出来.

此处介绍一题:

https://leetcode.cn/problems/corporate-flight-bookings/

(此题来自力扣1109题)

看完这个题,显然就是要用差分数组了.唯一要注意的就是:bookings[]中的每个元素(一维数组)的前两个元素所代表的下标都是从1开始的,所以我们需要将其还原成从0开始.

直接见代码把~:

class Difference{
    //差分数组
    private int[] diff;
    //根据给定的数组构造初始化一个差分数组
    public Difference(int[] nums){
        diff=new int[nums.length];
        diff[0]=nums[0];
        for(int i=1;i<diff.length;i++){
            diff[i]=nums[i]-nums[i-1];
        }
    }
    //给[i,j]中的元素都加inc
    public void increment(int i,int j,int inc){
        //inc当然可以为负
        diff[i]+=inc;//这个就表示从[i,...),根据差分数组还原结果数组时元素都+inc了
        //为了只给[i,j]这个局部做加法,我们需要把从[j+1,...)开始减inc
        if(j+1<diff.length){
            diff[j+1]-=inc;
        }
    }

    //根据差分数组拿最终的结果
    public int[] result(){
        int[] res = new int[diff.length];
        res[0]=diff[0];
        for(int i=1;i<res.length;i++){
            res[i]=res[i-1]+diff[i];
        }
        return res;
    }
}
class Solution {
    public int[] corpFlightBookings(int[][] bookings, int n) {
        //n表示差分数组的长度
        int[] nums=new int[n];
        Difference difference = new Difference(nums);//这个时候的差分已经构造好了
        for(int[] tmp:bookings){
            int i=tmp[0]-1;
            int j=tmp[1]-1;
            int inc=tmp[2];
            difference.increment(i,j,inc);
        }
        return difference.result();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值