給你乙個 m * n 的矩陣 mat 和乙個整數 k ,請你返回乙個矩陣 answer ,其中每個 answer[i][j] 是所有滿足下述條件的元素 mat[r][c] 的和:
i - k <= r <= i + k, j - k <= c <= j + k
(r, c) 在矩陣內。
示例 1:
輸入:mat = [[1,2,3],[4,5,6],[7,8,9]], k = 1
輸出:[[12,21,16],[27,45,33],[24,39,28]]
示例 2:
輸入:mat = [[1,2,3],[4,5,6],[7,8,9]], k = 2
輸出:[[45,45,45],[45,45,45],[45,45,45]]
m == mat.length
n == mat[i].length
1 <= m, n, k <= 100
1 <= mat[i][j] <= 100
【暴力版】對於每個位置,都考慮以其為中心的k*k矩陣,求該矩陣內的和即可。時間、空間複雜度是o(m
∗n∗k
)o(m*n*k)
o(m∗n∗
k)【二維字首和】儲存二維矩陣的字首和,則最終返回的矩陣,應該是sum[i + k][j + k] + sum[i - k][j - k] - sum[i + k][j - k] - sum[i - k][j + k]
注意一些細節:
儲存二維矩陣的字首和矩陣時,可以多增加左上一圈0的行,以避免超出矩陣範圍的麻煩
下標注意一下細節即可
時間複雜度和空間複雜度都是o(m
∗n
)o(m * n)
o(m∗n)
【暴力版】
class
solution
:def
matrixblocksum
(self, mat: list[list[
int]
], k:
int)
-> list[list[
int]]:
rows, cols =
len(mat)
,len
(mat[0]
) ret_matirx =[[
0]* cols for _ in
range
(rows)
]for each_row in
range
(rows)
: row_left, row_right =
max(
0, each_row - k)
,min
(rows -
1, each_row + k)
for each_col in
range
(cols)
: col_left, col_right =
max(
0, each_col - k)
,min
(cols -
1, each_col + k)
ret_matirx[each_row]
[each_col]
=sum
(sum
(row[col_left: col_right +1]
)for row in mat[row_left: row_right +1]
)return ret_matirx
【二維矩陣字首和】
class
solution
:def
matrixblocksum
(self, mat: list[list[
int]
], k:
int)
-> list[list[
int]]:
rows, cols =
len(mat)
,len
(mat[0]
) sum_matrix =[[
0]*(cols +1)
for _ in
range
(rows +1)
] sum_matrix[1]
[1]= mat[0]
[0]for each_row in
range(1
, rows +1)
:for each_col in
range(1
, cols +1)
: sum_matrix[each_row]
[each_col]
= sum_matrix[each_row -1]
[each_col]
+ sum_matrix[each_row]
[each_col -1]
- sum_matrix[each_row -1]
[each_col -1]
+ mat[each_row -1]
[each_col -1]
ret_matrix =[[
0]* cols for _ in
range
(rows)
]for each_row in
range
(rows)
:for each_col in
range
(cols)
: right_down_row, right_down_col =
min(each_row + k +
1, rows)
,min
(each_col + k +
1, cols)
left_up_row, left_up_col =
max(each_row - k,0)
,max
(each_col - k,0)
ret_matrix[each_row]
[each_col]
= sum_matrix[right_down_row]
[right_down_col]
+ sum_matrix[left_up_row]
[left_up_col]
- sum_matrix[right_down_row]
[left_up_col]
- sum_matrix[left_up_row]
[right_down_col]
return ret_matrix
leetcode 1314 矩陣區域和
這題不使用其他方法強行四重for也可以過,但是記憶體和時間占用可謂慘不忍睹。本題可採用矩陣字首和的方法解決,從記憶體占用到時間處理上都會好很多。第一遍 如下 感覺這題有點奇怪的簡單.先建立乙個和原矩陣相同大小的矩陣 然後使用四個判斷把rmin rmax,cmin,cmax確定下來 最後使用上述四個引...
leetcode 1314 矩陣區域和
給你乙個 m x n 的矩陣 mat 和乙個整數 k 請你返回乙個矩陣 answer 其中每個 answer i j 是所有滿足下述條件的元素 mat r c 的和 i k r i k,j k c j k 且 r,c 在矩陣內。示例 1 輸入 mat 1,2,3 4,5,6 7,8,9 k 1 輸出...
動態規劃 leetcode 1314
題目 給你乙個 m n 的矩陣 mat 和乙個整數 k 請你返回乙個矩陣 answer 其中每個 answer i j 是所有滿足下述條件的元素 mat r c 的和 i k r i k,j k c j k r,c 在矩陣內。解答 class solution def matrixblocksum ...