0
点赞
收藏
分享

微信扫一扫

1094.拼车

前端王祖蓝 2022-01-09 阅读 54

在这里插入图片描述

public boolean carPooling(int[][] trips, int capacity) {
        int[] nums = new int[1001];// 最多有 1000 个⻋站
        Difference df = new Difference(nums);// 构造差分解法
        for (int[] trip : trips) {
            int i = trip[1];// 第 trip[1] 站乘客上⻋
            // 第 trip[2] 站乘客已经下⻋,即乘客在⻋上的区间是 [trip[1], trip[2] - 1]
            int j = trip[2] - 1;
            int val = trip[0];// 乘客数量
            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;
    }

}
class Difference {
    private int[] diff;// 差分数组

    public Difference(int[] nums) {/* 输⼊⼀个初始数组, 区间操作将在这个数组上进⾏ */
        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];// 根据差分数组构造结果数组
         /*当 j+1 >= diff.length 时, 说明是对 nums[i] 及以后的整个数组都进⾏修改,
         那么就不需要再给 diff 数组减 val 了。*/
        for (int i = 1; i < diff.length; i++) {
            res[i] = diff[i] + res[i - 1];
        }
        return res;
    }
}
举报

相关推荐

0 条评论