package com.interview.dynamic; /** * Date 03/11/2016 * @author Tushar Roy * * Given a 2D array find the sum in given range defining a rectangle. * * Time complexity construction O(n*m) * Time complexity of query O(1) * Space complexity is O(n*m) * * Reference * https://leetcode.com/problems/range-sum-query-2d-immutable/ */ public class Immutable2DSumRangeQuery { private int[][] T; public Immutable2DSumRangeQuery(int[][] matrix) { int row = 0; int col = 0; if (matrix.length != 0) { row = matrix.length; col = matrix[0].length; } T = new int[row + 1][col + 1]; for (int i = 1; i < T.length; i++) { for (int j = 1; j < T[0].length; j++) { T[i][j] = T[i - 1][j] + T[i][j - 1] + matrix[i - 1][j - 1] - T[i - 1][j - 1]; } } } public int sumQuery(int row1, int col1, int row2, int col2) { row1++; col1++; row2++; col2++; return T[row2][col2] - T[row1 - 1][col2] - T[row2][col1 - 1] + T[row1 - 1][col1 - 1]; } public static void main(String args[]) { int[][] input = {{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}}; int[][] input1 = {{2,0,-3,4}, {6, 3, 2, -1}, {5, 4, 7, 3}, {2, -6, 8, 1}}; Immutable2DSumRangeQuery isr = new Immutable2DSumRangeQuery(input1); System.out.println(isr.sumQuery(1, 1, 2, 2)); } }