题目1:1109. 航班预订统计 - 力扣(LeetCode) (leetcode-cn.com)
思路:对每个航班的预定数量抽象成一个数组。航班预订表就相当于对数组num[i...j]上进行增加操作
可以想到用差分数组实现,差分数组原理见,不在赘述
代码如下:
class Solution { public int[] corpFlightBookings(int[][] bookings, int n) { // 抽象成一个数组 int[] nums = new int[n]; //一开始航班预定的数量为0,进行初始化 for(int i=0;i<nums.length;i++){ nums[i] = 0; } // 构建差分数组 int[] diff = new int[n]; diff[0] = nums[0]; for(int i=1;i<nums.length;i++){ diff[i] = nums[i]-nums[i-1]; } for(int[] booking: bookings){ // 注意转成数组索引要减一 int i = booking[0]-1; int j = booking[1]-1; int val = booking[2]; diff[i] += val; if(j+1<nums.length) diff[j+1] -=val; } //构建结果数组 int[] res = new int[nums.length]; res[0] = diff[0]; for(int i=1;i<nums.length;i++){ res[i] = res[i-1]+diff[i]; } return res; } }
题目2:
代码
class Solution { public boolean carPooling(int[][] trips, int capacity) { // 统计站种类的数量抽象成一个数组 int[] nums = new int[1001]; //构造差分数组 int[] diff = new int[1001]; diff[0] = nums[0]; for(int i=1;i<1000;i++){ diff[i] = nums[i] - nums[i-1]; } //减操作 for(int[] trip: trips){ int val = trip[0]; int i = trip[1]; int j = trip[2]-1; diff[i] +=val;
//考虑一次旅途中可能超载的情况
if(val>capacity) return false; if(j+1<1001) diff[j+1] -=val; } //结果数组 int[] res = new int[1001]; res[0] = diff[0]; for(int i=1;i<1001;i++){ res[i] = diff[i]+res[i-1]; if(res[i]>capacity) return false; } return true; } }