leetcode之差分数组

class Difference {

 // 差分数组

 private int[] diff;

 /* 输⼊⼀个初始数组,区间操作将在这个数组上进⾏ */

 public Difference(int[] nums) {

       assert nums.length > 0;

       diff = new int[nums.length];

       // 根据初始数组构造差分数组

       diff[0] = nums[0];

       for (int i = 1; i < nums.length; i++) {

            diff[i] = nums[i] - nums[i - 1];

        }

 }

       /* 给闭区间 [i,j] 增加 val(可以是负数)*/

 public void increment(int i, int j, int val) {

      diff[i] += val;

      if (j + 1 < diff.length) {

         diff[j + 1] -= val;

      }

 }

     /* 返回结果数组 */

   public int[] result() {

       int[] res = new int[diff.length];

       // 根据差分数组构造结果数组

       res[0] = diff[0];

       for (int i = 1; i < diff.length; i++) {

            res[i] = res[i - 1] + diff[i];

     }

       return res;

 }

}

在做区间加法,假设你有⼀个⻓度为 n 的数组,初始情况下所有的数字均为 0,你将会被给出 k 个更新的操作。 其中,每个操作会被表示为⼀个三元组:[startIndex, endIndex, inc],你需要将⼦数 组 A[startIndex ... endIndex](包括 startIndex 和 endIndex)增加 inc。 请你返回 k 次操作后的数组。类似的题目有航班预定和拼车等等

1094拼车

class Solution {

    public boolean carPooling(int[][] trips, int capacity) {

        int[] nums=new int[1001];

            // 构造差分解法

        Difference df=new Difference(nums);

        for(int[] trip:trips){

            int val=trip[0];

            int i=trip[1];

            int j=trip[2]-1;// 第 trip[2] 站乘客已经下⻋,

            // 即乘客在⻋上的区间是 [trip[1], trip[2] - 1]

            df.increment(i,j,val);

        }

        int[] res=df.result();

        for(int i=0;i<res.length;i++){

            if(res[i]>capacity){

                return false;

            }

        }

        return true;     

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值