前缀和——303. 区域和检索 - 数组不可变&&304. 二维区域和检索 - 矩阵不可变

303. 区域和检索 - 数组不可变

前缀和——303. 区域和检索 - 数组不可变&&304. 二维区域和检索 - 矩阵不可变_第1张图片
前缀和,用数组存取前缀和 从而每次查找时间复杂度为O(1)

/**
 * Your NumArray object will be instantiated and called as such:
 * NumArray* obj = new NumArray(nums);
 * int param_1 = obj->sumRange(i,j);
 */

class NumArray {
public:
    vector<int> sums;

    NumArray(vector<int>& nums) {
        int n = nums.size();
        sums.resize(n + 1);//创建一个长度为n+1存储前缀和的数组
        for (int i = 0; i < n; i++) {
            sums[i + 1] = sums[i] + nums[i];//计算对应位置前缀和
        }
    }

    int sumRange(int i, int j) {
        return sums[j + 1] - sums[i];
    }
};

304. 二维区域和检索 - 矩阵不可变

前缀和——303. 区域和检索 - 数组不可变&&304. 二维区域和检索 - 矩阵不可变_第2张图片
前缀和 同样的思路
创建一个m行n+1列的二维数组
相当于就是i行数组不可变 每一行就相当于上一题

class NumMatrix {
public:
    vector<vector<int>> sums;

    NumMatrix(vector<vector<int>>& matrix) {
        int m = matrix.size();
        if (m > 0) {
            int n = matrix[0].size();
            sums.resize(m, vector<int>(n + 1));
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    sums[i][j + 1] = sums[i][j] + matrix[i][j];
                }
            }
        }
    }

    int sumRegion(int row1, int col1, int row2, int col2) {
        int sum = 0;
        for (int i = row1; i <= row2; i++) {
            sum += sums[i][col2 + 1] - sums[i][col1];
        }
        return sum;
    }
};

同理也可以实现二维前缀和
sums[i,j]=sums[i-1,j] + sums[i,j-1] - sums[i-1,j-1] + matrix[i][j]
前缀和——303. 区域和检索 - 数组不可变&&304. 二维区域和检索 - 矩阵不可变_第3张图片
因为蓝色部分加了两次,所以减去一次

class NumMatrix {
public:
    vector<vector<int>> sums;

    NumMatrix(vector<vector<int>>& matrix) {
        int m = matrix.size();
        if (m > 0) {
            int n = matrix[0].size();
            sums.resize(m + 1, vector<int>(n + 1));
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    sums[i + 1][j + 1] = sums[i][j + 1] + sums[i + 1][j] - sums[i][j] + matrix[i][j];
                }
            }
        }
    }

    int sumRegion(int row1, int col1, int row2, int col2) {
        return sums[row2 + 1][col2 + 1] - sums[row1][col2 + 1] - sums[row2 + 1][col1] + sums[row1][col1];
    }
};

你可能感兴趣的:(Leetcode,前缀和,leetcode)