每日一题
今天的每日一题确实让博主我伤透脑筋 :x
闲话不多说~ 来人! 上图!
看完题目的我,也不准备重拳出击了,代码能过就好…
首先来分析题目
大致意思呢就是 ,他要让我们拿所有可能的子矩阵的sum值和target比较,通过计数来得出有多少子矩阵的sum值。
第一步
通过二维数组前缀和得把这个子矩阵的sum值拿到我们把每个方块比作矩阵中的1个元素,那么这个矩阵的sum值可由 S(红色) + S(蓝色) - S(红蓝) + S(黄色对勾) 得到。这里的S就代表了子矩阵元素的sum值。
如果解释的还不够清楚,下面我附上官方解释…
第二步
通过切割得到任一子矩阵的sum值(子矩阵位置不定)
看了我的解释和官方的解释,肯定有人和我当初一样有疑惑:怎么把所有子矩阵的sum值都遍历一遍呢?
我只想到了暴力,毕竟一力降十会hhhh
对于不同位置的子矩阵,我们可以通过切割来计算它的sum值
就比如我要求紫色对勾这个子矩阵的sum值(想象里面存在元素…)就可以类比上面的公式得出
S(4) - S(3) - S(2) + S(1) 这里S同样是矩阵元素的sum值。
下面附上代码块
比较暴力…毕竟一力降十会hhh
class Solution {
public int numSubmatrixSumTarget(int[][] matrix, int target) {
int[][] sums = new int[matrix.length+1][matrix[0].length+1];
for(int i = 1; i < sums.length; ++i){
for(int j = 1