20210831每日一题(get到差分法) 坚持写博客是一个好习惯,日日精进。
1109. 航班预订统计
1.暴力解法(面试官可能会挂人)
leetcoder 在评论区评论 这道题面试官给他30分钟,他3分钟写出暴力解法,直接被挂掉。
class Solution {
public int[] corpFlightBookings(int[][] bookings, int n) {
int len = bookings.length;
int[] dp = new int[n];
for(int[] booking:bookings){
for(int i = booking[0]-1;i<booking[1];i++){
dp[i]+= booking[2];
}
}
return dp;
}
}
2.差分法
差分法比较抽象,就好像是后面的座位先拿走,处理时再还回去。
class Solution {
//使用差分法(利用差分数组的性质解题)
/**
差分数组的性质就是前一个数加上nums[i] 就可以还原数组
比如nums [1,2,2,4]
cuts[i] = nums[i] - nums[i-1]
其差分数组为cuts [1,1,0,2],
nums[1] = nums[0] + cut[1];
根据题意来理解就是,座位我先给你加上,后面的先欠着所以就减去.
*/
public int[] corpFlightBookings(int[][] bookings, int n) {
int len = bookings.length;
//差分数组
int[] dp = new int[n];
//首先遍历表
for(int[] booking:bookings){
//记录并求和所有出发航班的座位和
dp[booking[0]-1] += booking[2];
if(booking[1]<n){//判断目的地是不是不为终点(防止越界)
dp[booking[1]]-=booking[2];
}
}
//利用差分数组的性质进行数组还原
for(int i=1;i<n;i++){
dp[i]+=dp[i-1];
}
return dp;
}
}