Day04 前缀和&差分 1109. 航班预订统计 、304. 二维区域和检索 - 矩阵不可变

一、304. 二维区域和检索 - 矩阵不可变
1、思路(二维前缀和)

使用二维前缀合

2、代码
JAVA 复制代码
class NumMatrix {
    int[][] sum;

    public NumMatrix(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        sum = new int[m + 1][n + 1];
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                // 注意索引是从1开始,当前值索引记得 -1
                sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + matrix[i - 1][j - 1];
            }
        }
    }

    public int sumRegion(int row1, int col1, int row2, int col2) {
        //注意题目索引从0开始,公式索引是从1开始
        row1++;
        col1++;
        row2++;
        col2++;
        return sum[row2][col2] - sum[row2][col1 - 1] - sum[row1 - 1][col2] + sum[row1 - 1][col1 - 1];
    }
}

/**
 * Your NumMatrix object will be instantiated and called as such:
 * NumMatrix obj = new NumMatrix(matrix);
 * int param_1 = obj.sumRegion(row1,col1,row2,col2);
 */
二、1109. 航班预订统计
1、思路(差分&前缀和)

1、差分数组B的前缀和数组就是原数组A

java 复制代码
B1+B2+....+ Bn = A1+ A2 -A1 + A3-A2+A4-A3... +An - An-1 =  An


B = delta(A);
A = sum(B)
即:A =sum(delta(A));

2、差分+前缀和 善于处理问题,对A数组 某连续端统一加 一个数字的问题

这类问题可以先得出差分,对差分计算,再求前缀和即可以得到答案

图中例子1拆解:

原数组A为[0,1,-1,-1,0] 需要 对 2 到 4 个数+1 最终应该为:【0,2,0,0,0】

复制代码
1> 先计算出原数组A差分数组B为:【0,1,-2,0,1】,再对差分B相同位置 +1 

B2 = A2 -A1 ; ------------>A1没变,A2本身+1了,即b2+1

B3 = A3-A2;------------> A2和A3都加1,抵消,不变

B4 = A4-A3;------------>A4和A3都加1,抵消,不变

B5 = A5-A4;------------>A5没变,A4本身+1了,即B5 -1

(L为2,r为4,1为d)得出公式:	**Bₗ** + d  ,B(r+1) - d 

2> 按上面得出公式对差分数组B操作得到:【0,2,-2,0,0】

3>最后对差分数组B求前缀和得到结果:【0,2,0,0,0】
2、代码
JAVA 复制代码
class Solution {
    public int[] corpFlightBookings(int[][] bookings, int n) {
        int[] delta = new int[n + 2];  // 差分要开0~n+1
        Arrays.fill(delta, 0);
        for (int[] booking : bookings) {
            int fir = booking[0];
            int last = booking[1];
            int seats = booking[2];
            // 差分模板
            delta[fir] += seats;
            delta[last + 1] -= seats;
        }

        int[] sum = new int[n + 1]; // 0~n
        for (int i = 1; i <= n; i++) {
            sum[i] = sum[i - 1] + delta[i];
        }
        // 往前移一位,前缀和求出来的是索引为1开始的
        int[] result = new int[n];
        for (int i = 1; i <= n; i++) {
            result[i - 1] = sum[i];
        }
        return result;
    }
}
相关推荐
B站_计算机毕业设计之家25 分钟前
python电商商品评论数据分析可视化系统 爬虫 数据采集 Flask框架 NLP情感分析 LDA主题分析 Bayes评论分类(源码) ✅
大数据·hadoop·爬虫·python·算法·数据分析·1024程序员节
小白菜又菜1 小时前
Leetcode 1518. Water Bottles
算法·leetcode·职场和发展
长存祈月心1 小时前
Rust Option 与 Result深度解析
算法
zcl_19911 小时前
记一次ThreadLocal导致的生产事故
java
RoboWizard1 小时前
怎么判断我的电脑是否支持PCIe 5.0 SSD?Kingston FURY Renegade G5
java·spring·智能手机·电脑·金士顿
杭州杭州杭州2 小时前
机器学习(3)---线性算法,决策树,神经网络,支持向量机
算法·决策树·机器学习
毕设源码-钟学长2 小时前
【开题答辩全过程】以 儿童游泳预约系统为例,包含答辩的问题和答案
java·eclipse
皮皮林5513 小时前
5种接口频率监控方案实战对比,性能、成本、复杂度全解析!
java
似水流年 光阴已逝3 小时前
从Jar包到K8s上线:全流程拆解+高可用实战
java·kubernetes·jar
YA3333 小时前
java设计模式八、组合模式
java·设计模式·组合模式