304. Range Sum Query 2D – Immutable LeetCode Solution
In this guide, you will get 304. Range Sum Query 2D – Immutable LeetCode Solution with the best time and space complexity. The solution to Range Sum Query D – Immutable problem is provided in various programming languages like C++, Java, and Python. This will be helpful for you if you are preparing for placements, hackathons, interviews, or practice purposes. The solutions provided here are very easy to follow and include detailed explanations.
Table of Contents
- Problem Statement
- Complexity Analysis
- Range Sum Query D – Immutable solution in C++
- Range Sum Query D – Immutable solution in Java
- Range Sum Query D – Immutable solution in Python
- Additional Resources
Problem Statement of Range Sum Query D – Immutable
Given a 2D matrix matrix, handle multiple queries of the following type:
Calculate the sum of the elements of matrix inside the rectangle defined by its upper left corner (row1, col1) and lower right corner (row2, col2).
Implement the NumMatrix class:
NumMatrix(int[][] matrix) Initializes the object with the integer matrix matrix.
int sumRegion(int row1, int col1, int row2, int col2) Returns the sum of the elements of matrix inside the rectangle defined by its upper left corner (row1, col1) and lower right corner (row2, col2).
You must design an algorithm where sumRegion works on O(1) time complexity.
Example 1:
Input
[“NumMatrix”, “sumRegion”, “sumRegion”, “sumRegion”]
[[[[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]]], [2, 1, 4, 3], [1, 1, 2, 2], [1, 2, 2, 4]]
Output
[null, 8, 11, 12]
Explanation
NumMatrix numMatrix = new NumMatrix([[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]]);
numMatrix.sumRegion(2, 1, 4, 3); // return 8 (i.e sum of the red rectangle)
numMatrix.sumRegion(1, 1, 2, 2); // return 11 (i.e sum of the green rectangle)
numMatrix.sumRegion(1, 2, 2, 4); // return 12 (i.e sum of the blue rectangle)
Constraints:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 200
-104 <= matrix[i][j] <= 104
0 <= row1 <= row2 < m
0 <= col1 <= col2 < n
At most 104 calls will be made to sumRegion.
Complexity Analysis
- Time Complexity: O(mn)
- Space Complexity: O(mn)
304. Range Sum Query 2D – Immutable LeetCode Solution in C++
class NumMatrix {
public:
NumMatrix(vector<vector<int>>& matrix) {
if (matrix.empty())
return;
const int m = matrix.size();
const int n = matrix[0].size();
// prefix[i][j] := the sum of matrix[0..i)[0..j)
prefix.resize(m + 1, vector<int>(n + 1));
for (int i = 0; i < m; ++i)
for (int j = 0; j < n; ++j)
prefix[i + 1][j + 1] =
matrix[i][j] + prefix[i][j + 1] + prefix[i + 1][j] - prefix[i][j];
}
int sumRegion(int row1, int col1, int row2, int col2) {
return prefix[row2 + 1][col2 + 1] - prefix[row1][col2 + 1] -
prefix[row2 + 1][col1] + prefix[row1][col1];
}
private:
vector<vector<int>> prefix;
};
/* code provided by PROGIEZ */
304. Range Sum Query 2D – Immutable LeetCode Solution in Java
class NumMatrix {
public NumMatrix(int[][] matrix) {
if (matrix.length == 0)
return;
final int m = matrix.length;
final int n = matrix[0].length;
// prefix[i][j] := the sum of matrix[0..i)[0..j)
prefix = new int[m + 1][n + 1];
for (int i = 0; i < m; ++i)
for (int j = 0; j < n; ++j)
prefix[i + 1][j + 1] = matrix[i][j] + prefix[i][j + 1] + prefix[i + 1][j] - prefix[i][j];
}
public int sumRegion(int row1, int col1, int row2, int col2) {
return prefix[row2 + 1][col2 + 1] - prefix[row1][col2 + 1] //
- prefix[row2 + 1][col1] + prefix[row1][col1];
}
private int[][] prefix;
}
// code provided by PROGIEZ
304. Range Sum Query 2D – Immutable LeetCode Solution in Python
class NumMatrix:
def __init__(self, matrix: list[list[int]]):
if not matrix:
return
m = len(matrix)
n = len(matrix[0])
# prefix[i][j] := the sum of matrix[0..i)[0..j)
self.prefix = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(m):
for j in range(n):
self.prefix[i + 1][j + 1] = (matrix[i][j] + self.prefix[i][j + 1] +
self.prefix[i + 1][j] - self.prefix[i][j])
def sumRegion(self, row1: int, col1: int, row2: int, col2: int) -> int:
return (self.prefix[row2 + 1][col2 + 1] - self.prefix[row1][col2 + 1] -
self.prefix[row2 + 1][col1] + self.prefix[row1][col1])
# code by PROGIEZ
Additional Resources
- Explore all LeetCode problem solutions at Progiez here
- Explore all problems on LeetCode website here
Happy Coding! Keep following PROGIEZ for more updates and solutions.