Skip to main content

Range Sum Query 2D - Immutable

LeetCode 304 | Difficulty: Medium​

Medium

Problem Description​

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

  • -10^4 <= matrix[i][j] <= 10^4

  • 0 <= row1 <= row2 < m

  • 0 <= col1 <= col2 < n

  • At most 10^4 calls will be made to sumRegion.

Topics: Array, Design, Matrix, Prefix Sum


Approach​

Design​

Choose the right data structures to meet the required time complexities for each operation. Consider hash maps for O(1) access, doubly-linked lists for O(1) insertion/deletion, and combining structures for complex requirements.

When to use

Implementing a data structure or system with specific operation time requirements.

Matrix​

Treat the matrix as a 2D grid. Common techniques: directional arrays (dx, dy) for movement, BFS/DFS for connected regions, in-place marking for visited cells, boundary traversal for spiral patterns.

When to use

Grid traversal, island problems, path finding, rotating/transforming matrices.

Prefix Sum​

Build a prefix sum array where prefix[i] = sum of elements from index 0 to i. Then any subarray sum [l..r] = prefix[r] - prefix[l-1]. This turns range sum queries from O(n) to O(1).

When to use

Subarray sum queries, counting subarrays with a target sum, range computations.


Solutions​

Solution 1: C# (Best: 156 ms)​

MetricValue
Runtime156 ms
Memory35.4 MB
Date2020-02-10
Solution
public class NumMatrix {

int[,] dp;
int m ;
int n;
public NumMatrix(int[][] matrix)
{
this.m = matrix.GetLength(0);
this.n = m>0 ? matrix[0].GetLength(0) : 0;
dp = new int[m+1,n+1];
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
dp[i,j] = dp[i-1,j]+ dp[i,j-1] + matrix[i-1][j-1] - dp[i-1,j-1];
}
}


}

public int SumRegion(int row1, int col1, int row2, int col2)
{
return dp[row2+1, col2+1] - dp[row2+1, col1] - dp[row1, col2+1] + dp[row1, col1];
}
}

/**
* Your NumMatrix object will be instantiated and called as such:
* NumMatrix obj = new NumMatrix(matrix);
* int param_1 = obj.SumRegion(row1,col1,row2,col2);
*/

Complexity Analysis​

ApproachTimeSpace
Prefix SumO(n)O(n)O(n)O(n)

Interview Tips​

Key Points
  • Discuss the brute force approach first, then optimize. Explain your thought process.
  • Clarify the expected time complexity for each operation before choosing data structures.