題目要求
給一 二維矩陣,計算由左上角 (row1, col1) 和右下角 (row2, col2) 劃定的矩形內元素和.
假設 |
---|
1. 你可以假設矩陣不變 |
2. 對函數 sumRegion(row1, col1,row2, col2) 的調用次數有很多次 |
3. 你可以假設 row1 ≤ row2 並且 col1 ≤ col2 |
算法思想
-
蠻力算法
調用一次sumRegion(row1, col1,row2, col2) ,求一次和,調用次數爲K,最壞的時間複雜度:O(K*max[(row2-row1)*(col2-col1)])
,最好的時間複雜度爲:O(K*min[(row2-row1)*(col2-col1)])
,優點:理解簡單,實現簡單;缺點:如果K值很大,m*n矩陣也很大,消耗時間不可預估。 -
優化算法
在初始化時,初始化一個matrix_sum
,matrix_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. 下標相減出現負數 |