矩阵前缀和。因为矩阵中可能包含负值,所以这题肯定不会存在什么剪枝,动态规划的可能性。所以这个题也就没什么弯弯绕绕。个人感觉算不上个Hard题目。

最直观的思路就是枚举子矩阵,既枚举矩阵的左上角节点和右下角节点所构成的子矩阵。枚举是4层循环。

然后矩阵和的计算是两层循环,肯定不能套在枚举子矩阵的循环里。

我们维护一个矩阵前缀和,即prefix[p][q]是左上角0,0节点和右下角p,q节点构成矩阵的面积和。

那么对于任意矩阵:(i,j)(p,q),其矩阵和 = prefix[p][q] – prefix[i-1][q] – prefix[p][j-1] + prefix[i-1][j-1]

可以在纸上画一下图,一下子就能看明白了。

最终的时间复杂度为O(n^4)

1074. 元素和为目标值的子矩阵数量

class Solution {
public int numSubmatrixSumTarget(int[][] matrix, int target) {
int m = matrix.length;
if (m == 0) {
return 0;
}
int n = matrix[0].length; int[][] f = new int[m][n];
for (int i = 0; i<m ;i++) {
f[i][0] = matrix[i][0];
for (int j = 1; j<n ; j++) {
f[i][j] = f[i][j-1] + matrix[i][j];
}
} // 左上角为0,0;右下角为i,j
int[][] prefixSum = new int[m][n];
for (int i=0;i<m;i++) {
for (int j=0;j<n;j++) {
if (i>0) {
prefixSum[i][j] = prefixSum[i-1][j];
}
prefixSum[i][j] += f[i][j];
}
} int ans = 0;
for (int i=0;i<m;i++) {
for (int j=0;j<n;j++) {
for (int p = i;p<m;p++) {
for (int q=j;q<n;q++) {
int sum = prefixSum[p][q];
if (i>0) {
sum -= prefixSum[i-1][q];
}
if (j>0) {
sum -= prefixSum[p][j-1];
}
if (i>0&&j>0) {
sum += prefixSum[i-1][j-1];
} if (sum == target) ans++;
}
}
}
} return ans;
}
}

最新文章

  1. 抛开flash,自己开发实现C++ RTMP直播流播放器
  2. ThreadLocal
  3. Application、 session、iewstate,以及repeater 的commang用法
  4. 创建html元素
  5. 在springMVC的controller层获取view层的参数的方式
  6. mfc_随机数生成器
  7. dp和px以及sp
  8. CentOS6.4 配置Haproxy
  9. Web 在线文件管理器学习笔记与总结(7)重命名文件
  10. DOS系统功能调用表(INT 21H)
  11. Scala中的If判断&amp;While&amp;For循环
  12. eclipse代码格式化
  13. (转)HttpHandler与HttpModule的理解与应用
  14. Manacher 算法-----o(n)回文串算法
  15. 数据结构 - trie
  16. Python 集体智慧编程PDF
  17. java的list几种实现方式的效率(ArrayList、LinkedList、Vector、Stack),以及 java时间戳的三种获取方式比较
  18. Unity游戏推送技术
  19. python批量处理文件夹中文件的问题
  20. Oracle数据导入指定表空间

热门文章

  1. Day07_37_深度剖析集合中的contains()方法
  2. jira 改变issue状态触发jenkins构建/发布
  3. IDEA常用个性化设置
  4. 三个dom xss常用tips
  5. 【Oauth2.0】Oauth2.0
  6. 路由器逆向分析------binwalk工具的详细使用说明
  7. hdu2438 三分
  8. POJ1135比较有意思的对短路(多米骨牌)
  9. 论文解读丨基于局部特征保留的图卷积神经网络架构(LPD-GCN)
  10. 在IDEA配置tomcat