【LeetCode】差分

小而精的算法—差分

  • 什么是差分数组?
    nums为原数组,那么差分数组就是遵循diff[i]=nums[i]-nums[i-1]的一个数组。
    如果要将差分数组转换成原数组,则需要ret[i]=ret[i-1]+nums[i]
  • 使用差分数组的好处?
    如果修改原数组left到right的值,不需要遍历只是将 diff[left]-=datadiff[rght+1]+=data即可。

代码实现:

public class Demo {
    //原数组
    private static final int [] nums = {1,2,6,7,9};
    //原数组构造差分数组
    public static int[] getDiff(int []nums){
        int [] diff = new int[nums.length];
        diff[0]=nums[0];
        for(int i=1;i<nums.length;i++){
        //关键代码
            diff[i]=nums[i]-nums[i-1];
        }
        return diff;
    }
    //更改原数组的值(left到right)
    public static void increase(int left,int right,int []diff,int num){
        diff[left]+=num;
        if(right<diff.length){
            diff[right+1]-=num;
        }
    }
    //差分数组构造原数组
    public static int [] getNums(int []diff){
        int nums1[]=new int [nums.length];
        nums1[0]=diff[0];
        for(int i=1;i< nums1.length;i++){
        //关键代码
            nums1[i]=nums1[i-1]+diff[i];
        }
        return nums1;
    }
}
LeetCode 370

image.png

会员题,直接套用上面的模板即可,不多介绍。

LeetCode 1109

image.png

法一: 最简单的思路,直接双层for循环遍历数组,之后加进answer中即可。但是我们当然不能满足于此。

class Solution {
    public int[] corpFlightBookings(int[][] bookings, int n) {
        int []answer = new int [n];
        for(int [] temp:bookings){
            for(int i=temp[0]-1;i<=temp[1]-1;i++){
            answer[i]+=temp[2];
            }
        }
        return answer;
    }
}

法二: 使用差分数组来进行计算。


class Solution {
    public int[] corpFlightBookings(int[][] bookings, int n) {
        int [] diff=new int [n];
        int [] ret = new int [n];
        //构建差分数组,与差分数组核心代码无异。
        for(int i=0;i<bookings.length;i++){
            diff[bookings[i][0]-1]+=bookings[i][2];
            if(bookings[i][1]<=n-1)
            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;
    }
}


LeetCode 1094

image.png

本题可以注意到,如果用数组存储乘客数量,乘客数量在一个区间内一直在变化,所以可以考虑使用差分数组来解决。

代码实现:

class Solution {
    public boolean carPooling(int[][] trips, int capacity) {
    //根据提示可知,一共1001个站点。
    int  [] diff = new int[1001];
    //构建差分数组
    for(int []temp:trips){
        diff[temp[1]]+=temp[0];
        diff[temp[2]]-=temp[0];
    }
    int []ret = new int [1001];
    ret[0]=diff[0];
    //差分数组转原数组
    for(int i=1;i<diff.length;i++){
        ret[i]=ret[i-1]+diff[i];
    }
    //找超过座位数的值。
    for(int i=0;i<ret.length;i++ ){
        if(ret[i]>capacity)
            return false;
        }
    return true;
    }
}

写在最后⭐
博主也是边学习边写作,如有异议敬请指出~
如果喜欢这篇文章的话,别忘了给博主点一个赞关注⭐哟!
你的关注就是对我的最大鼓励!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sivan_Xin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值