304. Range Sum Query 2D - Immutable
leetcode medium
Task
Дана двумерная матрица matrix. Обработайте несколько запросов следующего типа:
Вычислите сумму элементов матрицы внутри прямоугольника, определенного его верхним левым углом (row1, col1) и нижним правым углом (row2, col2).
Реализуйте класс NumMatrix:
- NumMatrix(int[][] matrix) Инициализирует объект целочисленной матрицей matrix.- int sumRegion(int row1, int col1, int row2, int col2) Возвращает сумму элементов матрицы внутри прямоугольника, определенного его верхним левым углом (row1, col1) и нижним правым углом (row2, col2).
C# solution
matched/originalpublic class NumMatrix {
private int[,] dp;
public NumMatrix(int[][] matrix) {
if (matrix.Length == 0 || matrix[0].Length == 0) return;
dp = new int[matrix.Length + 1, matrix[0].Length + 1];
for (int r = 0; r < matrix.Length; r++) {
for (int c = 0; c < matrix[0].Length; c++) {
dp[r + 1, c + 1] = dp[r + 1, c] + dp[r, c + 1] + matrix[r][c] - dp[r, c];
}
}
}
public int SumRegion(int row1, int col1, int row2, int col2) {
return dp[row2 + 1, col2 + 1] - dp[row1, col2 + 1] - dp[row2 + 1, col1] + dp[row1, col1];
}
}C++ solution
auto-draft, review before submit#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
public class NumMatrix {
private int[,] dp;
public NumMatrix(int[][] matrix) {
if (matrix.size() == 0 || matrix[0].size() == 0) return;
dp = new int[matrix.size() + 1, matrix[0].size() + 1];
for (int r = 0; r < matrix.size(); r++) {
for (int c = 0; c < matrix[0].size(); c++) {
dp[r + 1, c + 1] = dp[r + 1, c] + dp[r, c + 1] + matrix[r][c] - dp[r, c];
}
}
}
public int SumRegion(int row1, int col1, int row2, int col2) {
return dp[row2 + 1, col2 + 1] - dp[row1, col2 + 1] - dp[row2 + 1, col1] + dp[row1, col1];
}
}Java solution
matched/originalpublic class NumMatrix {
private int[][] dp;
public NumMatrix(int[][] matrix) {
if (matrix.length == 0 || matrix[0].length == 0) return;
dp = new int[matrix.length + 1][matrix[0].length + 1];
for (int r = 0; r < matrix.length; r++) {
for (int c = 0; c < matrix[0].length; c++) {
dp[r + 1][c + 1] = dp[r + 1][c] + dp[r][c + 1] + matrix[r][c] - dp[r][c];
}
}
}
public int sumRegion(int row1, int col1, int row2, int col2) {
return dp[row2 + 1][col2 + 1] - dp[row1][col2 + 1] - dp[row2 + 1][col1] + dp[row1][col1];
}
}JavaScript solution
matched/originalclass NumMatrix {
constructor(matrix) {
if (matrix.length === 0 || matrix[0].length === 0) return;
const m = matrix.length, n = matrix[0].length;
this.dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
for (let r = 0; r < m; r++) {
for (let c = 0; c < n; c++) {
this.dp[r + 1][c + 1] = this.dp[r + 1][c] + this.dp[r][c + 1] + matrix[r][c] - this.dp[r][c];
}
}
}
sumRegion(row1, col1, row2, col2) {
return this.dp[row2 + 1][col2 + 1] - this.dp[row1][col2 + 1] - this.dp[row2 + 1][col1] + this.dp[row1][col1];
}
}Python solution
matched/originalclass NumMatrix:
def __init__(self, matrix: List[List[int]]):
if not matrix or not matrix[0]:
self.dp = []
return
m, n = len(matrix), len(matrix[0])
self.dp = [[0] * (n + 1) for _ in range(m + 1)]
for r in range(m):
for c in range(n):
self.dp[r + 1][c + 1] = self.dp[r + 1][c] + self.dp[r][c + 1] + matrix[r][c] - self.dp[r][c]
def sumRegion(self, row1: int, col1: int, row2: int, col2: int) -> int:
return self.dp[row2 + 1][col2 + 1] - self.dp[row1][col2 + 1] - self.dp[row2 + 1][col1] + self.dp[row1][col1]Go solution
matched/originalpackage main
type NumMatrix struct {
dp [][]int
}
func Constructor(matrix [][]int) NumMatrix {
if len(matrix) == 0 || len(matrix[0]) == 0 {
return NumMatrix{}
}
m, n := len(matrix), len(matrix[0])
dp := make([][]int, m+1)
for i := range dp {
dp[i] = make([]int, n+1)
}
for r := 0; r < m; r++ {
for c := 0; c < n; c++ {
dp[r+1][c+1] = dp[r+1][c] + dp[r][c+1] + matrix[r][c] - dp[r][c]
}
}
return NumMatrix{dp}
}
func (this *NumMatrix) SumRegion(row1, col1, row2, col2 int) int {
return this.dp[row2+1][col2+1] - this.dp[row1][col2+1] - this.dp[row2+1][col1] + this.dp[row1][col1]
}Explanation
Algorithm
Пример:
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]]
👨💻
Алгоритм:
Инициализация:
Создайте двумерный массив sums размером (m + 1) x (n + 1), где m и n — размеры исходной матрицы matrix. Заполните этот массив нулями.
Предварительное вычисление сумм:
Заполните массив sums, где каждый элемент sums[i][j] будет содержать сумму всех элементов матрицы от начала до позиции (i-1, j-1) включительно.
Вычисление диапазонной суммы:
Для каждого запроса суммы элементов внутри прямоугольника, определенного его углами (row1, col1) и (row2, col2), используйте предварительно вычисленный массив sums для получения результата за O(1) времени.
😎