矩阵前缀和。因为矩阵中可能包含负值,所以这题肯定不会存在什么剪枝,动态规划的可能性。所以这个题也就没什么弯弯绕绕。个人感觉算不上个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;
}
}

[LeetCode] 1074. 元素和为目标值的子矩阵数量的更多相关文章

  1. python(leetcode)-重复元素算法题

    leetcode初级算法 问题描述 给定一个整数数组,判断是否存在重复元素. 如果任何值在数组中出现至少两次,函数返回 true.如果数组中每个元素都不相同,则返回 false. 该问题表述非常简单 ...

  2. [LeetCode] Number Of Corner Rectangles 边角矩形的数量

    Given a grid where each entry is only 0 or 1, find the number of corner rectangles. A corner rectang ...

  3. LeetCode 447. Number of Boomerangs (回力标的数量)

    Given n points in the plane that are all pairwise distinct, a "boomerang" is a tuple of po ...

  4. [LeetCode] 305. Number of Islands II 岛屿的数量之二

    A 2d grid map of m rows and n columns is initially filled with water. We may perform an addLand oper ...

  5. [LeetCode] 305. Number of Islands II 岛屿的数量 II

    A 2d grid map of m rows and n columns is initially filled with water. We may perform an addLand oper ...

  6. C#LeetCode刷题之#447-回旋镖的数量(Number of Boomerangs)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3792 访问. 给定平面上 n 对不同的点,"回旋镖&q ...

  7. leetcode难题

    4 寻找两个有序数组的中位数       35.9% 困难     10 正则表达式匹配       24.6% 困难     23 合并K个排序链表       47.4% 困难     25 K ...

  8. LeetCode刷题总结-数组篇(中)

    本文接着上一篇文章<LeetCode刷题总结-数组篇(上)>,继续讲第二个常考问题:矩阵问题. 矩阵也可以称为二维数组.在LeetCode相关习题中,作者总结发现主要考点有:矩阵元素的遍历 ...

  9. hiho #1502:最大子矩阵(元素和不超过k)

    #1502 : 最大子矩阵 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个NxM的矩阵A和一个整数K,小Hi希望你能求出其中最大(元素数目最多)的子矩阵,并且该 ...

随机推荐

  1. 研发团队管理:IT研发中项目和产品原来区别那么大,项目级的项目是项目,产品级的项目是产品!!!

    前言   从事IT行业多年,一路从小杂兵成长为大团队Leader,对于研发整个体系比较清楚,其实大多人都经历过但是都忽略了的研发成本管控的一个关键的点就是研发过程中项目级和产品级的区别.   市场基本 ...

  2. 图解Leetcode组合总和系列——回溯(剪枝优化)+动态规划

    Leetcode组合总和系列--回溯(剪枝优化)+动态规划 组合总和 I 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 ...

  3. 记一次xss漏洞挖掘

    博客园在整改中,无法更新文章,难受啊... 记录一次react的xss漏洞发现,比较有意思: 某个站: 直接输入<xxx>,直接把我跳转到了404,猜测可能做了一些验证: 尝试多重编码,发 ...

  4. MySQL8安装教程及问题解决

    目录 1.下载MySQL的zip文件,解压,在根目录(bin所在的目录)下创建my.ini文件 2.管理员模式打开命令提示符(shell或者说小黑窗),按以下命令操作. 3.不过......我这里密码 ...

  5. 【OOM】记录一次生产上的OutOfMemory解决过程

    一.项目架构 SpringCloud  Dalston.SR1 + SpringBoot 1.5.9 + Mysql +Redis + RabbitMQ 所有的业务模块的应用服务都部署在同一个服务器, ...

  6. Python 爬虫之Scrapy框架

    Scrapy框架架构 Scrapy框架介绍: 写一个爬虫,需要做很多的事情.比如:发送网络请求.数据解析.数据存储.反反爬虫机制(更换ip代理.设置请求头等).异步请求等.这些工作如果每次都要自己从零 ...

  7. 【翻译】WPF中的数据绑定表达式

    有很多文章讨论绑定的概念,并讲解如何使用StaticResources和DynamicResources绑定属性.这些概念使用WPF提供的数据绑定表达式.在本文中,让我们研究WPF提供的不同类型的数据 ...

  8. 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第n次落地时,共经过多少米?第n次反弹多高?(n<=10)

    单纯考逻辑 题目: 一球从100米高度自由落下,每次落地后反跳回原高度的一半:再落下,求它在第n次落地时,共经过多少米?第n次反弹多高?(n<=10) 输入描述: 一行,一个整数n (1< ...

  9. 【maven】Failed to execute goal org.apache.maven.plugins:maven-site-plugin:3.3:site (default-site)

    问题描述 site一点击就报错,如下 Failed to execute goal org.apache.maven.plugins:maven-site-plugin:3.3:site (defau ...

  10. druid-spring-boot-starter的配置

    #数据源基本信息 spring: datasource: druid: username: root password: 123456 url: jdbc:mysql://localhost:3306 ...