https://leetcode.com/problems/range-sum-query-2d-immutable/description/
Problem:
Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper left corner (row1, col1) and lower right corner (row2, col2).
The above rectangle (with the red border) is defined by (row1, col1) = (2, 1) and (row2, col2) = (4, 3), which contains sum = 8.
Example:
1 2 3 4 5 6 7 8 9 10 11 |
Given matrix = [ [3, 0, 1, 4, 2], [5, 6, 3, 2, 1], [1, 2, 0, 1, 5], [4, 1, 0, 1, 7], [1, 0, 3, 0, 5] ] sumRegion(2, 1, 4, 3) : 8 sumRegion(1, 1, 2, 2) : 11 sumRegion(1, 2, 2, 4) : 12 |
Note:
- You may assume that the matrix does not change.
- There are many calls to sumRegion function.
- You may assume that row1 ≤ row2 and col1 ≤ col2.
Idea:
Dynamic programming
Time complexity:
O(n^2)
sumRegion: O(1)
Solution:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
// Author: Huahua // Time complexity: // constructor: O(n^2) // sumRegion: O(1) // Running time: 22 ms 9/2017 class NumMatrix { public: NumMatrix(const vector<vector<int>>& matrix) { sums_.clear(); if (matrix.empty()) return; int m = matrix.size(); int n = matrix[0].size(); // sums_[i][j] = sum(matrix[0][0] ~ matrix[i-1][j-1]) sums_ = vector<vector<int>>(m + 1, vector<int>(n + 1, 0)); for (int i = 1; i <= m; ++i) for (int j = 1; j <= n; ++j) sums_[i][j] = matrix[i - 1][j - 1] + sums_[i - 1][j] + sums_[i][j - 1] - sums_[i - 1][j - 1]; } int sumRegion(int row1, int col1, int row2, int col2) { return sums_[row2 + 1][col2 + 1] - sums_[row2 + 1][col1] - sums_[row1][col2 + 1] + sums_[row1][col1]; } private: vector<vector<int>> sums_; }; /** * Your NumMatrix object will be instantiated and called as such: * NumMatrix obj = new NumMatrix(matrix); * int param_1 = obj.sumRegion(row1,col1,row2,col2); */ |
请尊重作者的劳动成果,转载请注明出处!花花保留对文章/视频的所有权利。
如果您喜欢这篇文章/视频,欢迎您捐赠花花。
If you like my articles / videos, donations are welcome.
Be First to Comment