給出矩陣 matrix 和目標值 target,返回元素總和等于目標值的非空子矩陣的數量。
子矩陣 x1, y1, x2, y2 是滿足 x1 <= x <= x2 且 y1 <= y <= y2 的所有單元 matrix[x][y] 的集合。
如果 (x1, y1, x2, y2) 和 (x1’, y1’, x2’, y2’) 兩個子矩陣中部分坐標不同(如:x1 != x1’),那么這兩個子矩陣也不同。
示例 1:
輸入:matrix = [[0,1,0],[1,1,1],[0,1,0]], target = 0
輸出:4
解釋:四個只含 0 的 1x1 子矩陣。
示例 2:
輸入:matrix = [[1,-1],[-1,1]], target = 0
輸出:5
解釋:兩個 1x2 子矩陣,加上兩個 2x1 子矩陣,再加上一個 2x2 子矩陣。
示例 3:
輸入:matrix = [[904]], target = 0
輸出:0
解題思路
遍歷所有可以可選的上下邊界[i,j]。
- 在上下界已經確定的情況下,維護前綴和數組cnt[i],代表第i列所有元素的累加和。
- 從第一列開始不斷累加,累加到cur當中,cur代表上下界確定的情況下,累加起來的前n列
- 使用map記錄下前n列累加和為k1的情況,當遍歷到前n2列時,累加和為k2時,若滿足k2-k1=target,即說明子矩陣[n,n2]的和為target。
代碼
func numSubmatrixSumTarget(matrix [][]int, target int) (res int) {for i := 0; i < len(matrix); i++ {col := make([]int, len(matrix[0]))for j := i; j < len(matrix); j++ {for z := 0; z < len(matrix[0]); z++ {col[z] += matrix[j][z]}func() {m := make(map[int]int)m[0] = 1cur := 0for i := 0; i < len(matrix[0]); i++ {cur += col[i]i2, has := m[cur-target]if has {res += i2}m[cur]++}}()}}return}