leetcode 1314 矩陣區域和

2021-10-06 14:12:31 字數 3324 閱讀 4380

給你乙個 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 ...