[LeetCode] 1074. 元素和为目标值的子矩阵数量
矩阵前缀和。因为矩阵中可能包含负值,所以这题肯定不会存在什么剪枝,动态规划的可能性。所以这个题也就没什么弯弯绕绕。个人感觉算不上个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)
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. 元素和为目标值的子矩阵数量的更多相关文章
- python(leetcode)-重复元素算法题
leetcode初级算法 问题描述 给定一个整数数组,判断是否存在重复元素. 如果任何值在数组中出现至少两次,函数返回 true.如果数组中每个元素都不相同,则返回 false. 该问题表述非常简单 ...
- [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 ...
- LeetCode 447. Number of Boomerangs (回力标的数量)
Given n points in the plane that are all pairwise distinct, a "boomerang" is a tuple of po ...
- [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 ...
- [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 ...
- C#LeetCode刷题之#447-回旋镖的数量(Number of Boomerangs)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3792 访问. 给定平面上 n 对不同的点,"回旋镖&q ...
- leetcode难题
4 寻找两个有序数组的中位数 35.9% 困难 10 正则表达式匹配 24.6% 困难 23 合并K个排序链表 47.4% 困难 25 K ...
- LeetCode刷题总结-数组篇(中)
本文接着上一篇文章<LeetCode刷题总结-数组篇(上)>,继续讲第二个常考问题:矩阵问题. 矩阵也可以称为二维数组.在LeetCode相关习题中,作者总结发现主要考点有:矩阵元素的遍历 ...
- hiho #1502:最大子矩阵(元素和不超过k)
#1502 : 最大子矩阵 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个NxM的矩阵A和一个整数K,小Hi希望你能求出其中最大(元素数目最多)的子矩阵,并且该 ...
随机推荐
- 小程序picker地区级联选择的问题及解决方案
各种系统中行政区域选择的场景不少,我们也有不少这样的场景.本想使用第三方的组件,但是大多有些小问题,不能满足需要.后面使用picker的mulitSelector模式写了一个,发现这种列模式的体验并好 ...
- MySQL数据库干货分享!mysql每月自动创建表结构
如果你刚好在学MySQL,博主推荐一套很详细的MySQL教程 主要详细讲解了MySQL的相关知识,包括MySQL概述,MySQL应用环境,MySQL系统特性,MySQL初学基础,MySQL管理工具,如 ...
- Python 基础教程 —— 网络爬虫入门篇
前言 Python 是一种解释型.面向对象.动态数据类型的高级程序设计语言,它由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年.自面世以后,Pytho ...
- Hyperledger Fabric2.3环境搭建
采用Ubuntu系统下搭建 HyperledgerFabric2.3 环境 安装GoLang 下载golang安装包 https://studygolang.com/dl 下载完成后解压,移到/usr ...
- C++扫雷小游戏(基于CMD命令行)
这个小游戏是笔者在大一C语言课程设计的时候写的,基于命令行,为了显得漂亮一些,特别加上了彩色特效~~~ 注意:Win10系统须将命令行调为旧版命令行,否则有可能会显示乱码! 代码示例: #includ ...
- hdu4990 矩阵快速幂
题意: 给你一短代码,让你优化这个代码,代码如下 #pragma comment(linker, "/STACK:1024000000,1024000000") #in ...
- Linux中的网络配置
目录 网卡的配置 NetworkManager的使用 Team网卡绑定 Centos6.5.Redhat7.Kali网卡配置的不同 Kali桥接模式配置静态ip 网卡的配置 网卡命名的不同: Rhel ...
- (ML邹博)回归
目录 线性回归 高斯分布 最大似然估计 最小二乘法的本质 Logistic回归 工具 梯度下降算法 最大似然估计 线性回归 对于单个变量: y=ax+b 对于多个变量: 使用极大似然估计解释最小二乘法 ...
- 15 个让新手爱不释手的 Python 高级库
为什么我喜欢 Python ? 对于初学者来说,这是一种简单易学的编程语言:另一个原因:大量开箱即用的第三方库,正是 23 万个由用户提供的软件包使得 Python 真正强大和流行 在本文中,我挑选了 ...
- .NET生成小程序码,并合自定义背景图生成推广小程序二维码
前言: 对于小程序大家可能都非常熟悉了,随着小程序的不断普及越来越多的公司都开始推广使用起来了.今天接到一个需求就是生成小程序码,并且于运营给的推广图片合并在一起做成一张漂亮美观的推广二维码,扫码这种 ...