665、Lintcode--2D不可變矩陣求和

題目要求

題目來源:LintCode

給一 二維矩陣,計算由左上角 (row1, col1) 和右下角 (row2, col2) 劃定的矩形內元素和.

假設
1. 你可以假設矩陣不變
2. 對函數 sumRegion(row1, col1,row2, col2) 的調用次數有很多次
3. 你可以假設 row1 ≤ row2 並且 col1 ≤ col2

算法思想

  1. 蠻力算法
    調用一次sumRegion(row1, col1,row2, col2) ,求一次和,調用次數爲K,最壞的時間複雜度:O(K*max[(row2-row1)*(col2-col1)]),最好的時間複雜度爲:O(K*min[(row2-row1)*(col2-col1)]),優點:理解簡單,實現簡單;缺點:如果K值很大,m*n矩陣也很大,消耗時間不可預估。

  2. 優化算法
    在初始化時,初始化一個matrix_summatrix_sum[i][j]存儲matrix[0][0]matrix[i][j]確定的矩陣的和,然後根據matrix_sum按照矩陣公式求和,時間複雜度爲O(m*n)
    初始化matrix_sum需要的公式:
    matrix_sum[i][j] = matrix_sum[i-1][j] + matrix_sum[i][j-1] - matrix_sum[i-1][j-1] + matrix[i][j]
    任意矩陣的求和公式:
    result = matrix_sum[row2][col2] - matrix_sum[row1-1][col2] - matrix_sum[row2][col1-1] + matrix_sum[row1-1][col1-1]

參考代碼

這是優化算法的代碼,暴力算法意義不大,所有不給參考

class NumMatrix:
    """
    @param: matrix: a 2D matrix
    """
    def __init__(self, matrix):
        # do intialization if necessary
        self.matrix = matrix
        self.matrix_sum = []  
        # 初始化一個和矩陣,self.matrix_sum = [i][j]存儲[0][0][i][j]座標確定的區間和
        for i in range(len(matrix)):
            for j in range(len(matrix[0])):
                if i == 0:
                    if j == 0:
                        self.matrix_sum.append([self.matrix[i][j]])
                    else:
                        self.matrix_sum[i].append(self.matrix_sum[i][j-1]+self.matrix[i][j])
                else:
                    if j == 0:
                        self.matrix_sum.append([self.matrix_sum[i-1][j]+self.matrix[i][j]])
                    else:
                        self.matrix_sum[i].append(self.matrix_sum[i][j-1]+self.matrix_sum[i-1][j]+self.matrix[i][j]
                        -self.matrix_sum[i-1][j-1])
                    

    """
    @param: row1: An integer
    @param: col1: An integer
    @param: row2: An integer
    @param: col2: An integer
    @return: An integer
    """
    def sumRegion(self, row1, col1, row2, col2):
        # write your code here
        result = 0
        if (col1-1) < 0:
        	# 求和區間是第一個元素
            if (row1-1)<0:
                result = self.matrix_sum[row2][col2]
            # 求和區間是第一列
            else:
                result = self.matrix_sum[row2][col2] - self.matrix_sum[row1-1][col2]
        else:
        	# 多列的前提下,求和區間在第一行
            if (row1-1)<0:
                result = self.matrix_sum[row2][col2] - self.matrix_sum[row2][col1-1]
            # 除了上面3種情況,其他的任意區間
            else:
                result = self.matrix_sum[row2][col2] - self.matrix_sum[row2][col1-1] - self.matrix_sum[row1-1][col2] 
                + self.matrix_sum[row1-1][col1-1]
        return result
            

注意事項

代碼的實現注意考慮特殊情況、邊界問題,增強算法的健壯性和穩定性

特殊情況 邊界問題
1. 矩陣爲空 1. 處理一個元素
2. 矩陣只有一個元素 2. 處理第一行元素
3. 矩陣只有一行 3. 處理第一列元素
4. 矩陣只有一列 4. 下標相減出現負數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章