LeetCode:Range Sum Query 2D -Immutable-矩陣指定區域內的元素和

一、題目名稱java

Range Sum Query 2D(矩陣指定區域內的元素和)ide

二、題目地址函數

https://leetcode.com/problemset/algorithms/code

三、題目內容element

英文: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).leetcode

中文:給定一個二維矩陣和兩個座標,求出以這兩個座標爲左上角、右下角的矩形中的全部元素和開發

例如:get

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

注意:你能夠假定矩陣不會發生變化,sumRegion函數會被調用屢次it

四、解題方法io

這道題和第303題(Range Sum Query)相似。本題中給出的類名爲NumMatrix,而且裏面有兩個函數。第一個函數爲構造函數,第二個函數爲sumRegion,這兩個函數都是咱們要實現的函數。

題目給出的代碼結構以下:

public class NumMatrix {

    public NumMatrix(int[][] matrix) {
        
    }

    public int sumRegion(int row1, int col1, int row2, int col2) {
        
    }
}


// Your NumMatrix object will be instantiated and called as such:
// NumMatrix numMatrix = new NumMatrix(matrix);
// numMatrix.sumRegion(0, 1, 2, 3);
// numMatrix.sumRegion(1, 2, 3, 4);

本題的解題思路也和303相似,因爲sumRegion函數會被調用屢次,因此不能採用每次調用該函數時從頭統計全部元素的方法。

能夠創建一個與給定矩陣行、列數相同的中間矩陣matrixSums,matrixSums中的每一個位置的元素值,是原矩陣matrix中全部行數、列數不大於該位置的元素值的和。在調用sumRegion函數時,能夠經過中間矩陣matrixSums快速計算出結果。

Java代碼以下:

/**
 * @功能說明:LeetCode 304 - Range Sum Query 2D - Immutable
 * @開發人員:Tsybius2014
 * @開發時間:2015年11月15日
 */
public class NumMatrix {

    public int[][] matrixSums;
    
    /**
     * 構造函數
     * @param matrix
     */
    public NumMatrix(int[][] matrix) {
        matrixSums = null;
        if (matrix.length > 0 && matrix[0].length > 0) {
            matrixSums = new int[matrix.length][matrix[0].length];
            for (int i = 0; i < matrix.length; i++) {
                for (int j = 0; j < matrix[0].length; j++) {
                    if (i == 0) {
                        if (j == 0) {
                            matrixSums[i][j] = matrix[i][j];
                        } else {
                            matrixSums[i][j] = matrixSums[i][j - 1] + matrix[i][j];
                        }
                    } else {
                        if (j == 0) {
                            matrixSums[i][j] = matrixSums[i - 1][j] + matrix[i][j];
                        } else {
                            matrixSums[i][j] = matrixSums[i - 1][j] +
                                (matrixSums[i][j - 1] - matrixSums[i - 1][j - 1]) + 
                                matrix[i][j];
                        }
                    }
                }
            }
        }
    }

    /**
     * 給出左上角、右下角座標,計算矩形區域內的元素和
     * @param row1
     * @param col1
     * @param row2
     * @param col2
     * @return
     */
    public int sumRegion(int row1, int col1, int row2, int col2) {
        if (matrixSums == null || row1 > row2 || col1 > col2) {
            return 0;
        }
        if (row1 == 0 && col1 == 0) {
            return matrixSums[row2][col2];
        } else if (row1 == 0) {
            return matrixSums[row2][col2] - matrixSums[row2][col1 - 1];
        } else if (col1 == 0) {
            return matrixSums[row2][col2] - matrixSums[row1 - 1][col2];
        } else {
            return matrixSums[row2][col2] - matrixSums[row1 - 1][col2] - 
                (matrixSums[row2][col1 - 1] - matrixSums[row1 - 1][col1 - 1]);
        }
    }
}

END

相關文章
相關標籤/搜索