字首和

英击长空發表於2024-04-01

題目

LeetCode 力扣 難度
303. Range Sum Query - Immutable 303. 區域和檢索 - 陣列不可變 🟢
304. Range Sum Query 2D - Immutable 304. 二維區域和檢索 - 矩陣不可變 🟠
-同 劍指 Offer II 013. 二維子矩陣的和 🟠

-----------

303. 區域和檢索 - 陣列不可變

我的答案

1、題目理解
字首和只差
2、注意事項
字首和 preSum[1] = 0+num[0],即preSum[i+1]包含num[i]
向量動態擴充套件大小的方法 resize

3、我的程式碼

using namespace std;
class NumArray {
    vector<int> presum;
public:
    NumArray(vector<int>& nums) {
        presum.resize(nums.size() + 1, 0);
        presum[0] = 0;
        for (int i = 0; i < nums.size(); ++i) {
            presum[i + 1] = presum[i] + nums[i];
        }
    }

    int sumRange(int left, int right) {
        
        return presum[right+1] - presum[left];
    }
};


python 版本

class NumArray:

    def __init__(self, nums: List[int]):
        self.sums = [0]
        _sums = self.sums

        for num in nums:
            _sums.append(_sums[-1] + num)

    def sumRange(self, i: int, j: int) -> int:
        _sums = self.sums
        return _sums[j + 1] - _sums[i]

作者:力扣官方題解
連結:https://leetcode.cn/problems/range-sum-query-immutable/solutions/627052/qu-yu-he-jian-suo-shu-zu-bu-ke-bian-by-l-px41/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

304. 二維區域和檢索 - 矩陣不可變

我的答案:多組一維字首和之和

1、題目理解
多組字首和之差
2、注意事項
向量動態擴充套件大小的方法 resize,最外層也需要擴一次
3、我的思路


using namespace std;

class NumMatrix {
    vector<vector<int>> presum;
public:
    NumMatrix(vector<vector<int>> &matrix) {
        presum.resize(matrix.size());
        for (int j = 0; j < matrix.size(); ++j) {
            presum[j].resize(matrix[j].size() + 1, 0);
            presum[j][0] = 0;
            for (int i = 0; i < matrix[j].size(); ++i) {
                presum[j][i + 1] = presum[j][i] + matrix[j][i];
            }
        }

    }

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

二維字首和解法

二維字首和

class NumMatrix:
    def __init__(self, matrix: List[List[int]]):
        m, n = len(matrix), len(matrix[0])
        s = [[0] * (n + 1) for _ in range(m + 1)]
        for i, row in enumerate(matrix):
            for j, x in enumerate(row):
                s[i + 1][j + 1] = s[i + 1][j] + s[i][j + 1] - s[i][j] + x
        self.s = s

    # 返回左上角在 (r1,c1) 右下角在 (r2,c2) 的子矩陣元素和
    def sumRegion(self, r1: int, c1: int, r2: int, c2: int) -> int:
        return self.s[r2 + 1][c2 + 1] - self.s[r2 + 1][c1] - self.s[r1][c2 + 1] + self.s[r1][c1]

作者:靈茶山艾府
連結:https://leetcode.cn/problems/range-sum-query-2d-immutable/solutions/2667331/tu-jie-yi-zhang-tu-miao-dong-er-wei-qian-84qp/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

相關文章