小而精的算法—差分
- 什么是差分数组?
nums为原数组,那么差分数组就是遵循diff[i]=nums[i]-nums[i-1]
的一个数组。
如果要将差分数组转换成原数组,则需要ret[i]=ret[i-1]+nums[i]
- 使用差分数组的好处?
如果修改原数组left到right的值,不需要遍历只是将diff[left]-=data
且diff[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
会员题,直接套用上面的模板即可,不多介绍。
LeetCode 1109
法一: 最简单的思路,直接双层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
本题可以注意到,如果用数组存储乘客数量,乘客数量在一个区间内一直在变化,所以可以考虑使用差分数组来解决。
代码实现:
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;
}
}
⭐写在最后⭐
博主也是边学习边写作,如有异议敬请指出~
如果喜欢这篇文章的话,别忘了给博主点一个赞和关注⭐哟!
你的关注就是对我的最大鼓励!