目标值子矩阵的数量

ops/2025/1/11 23:34:39/

目标值子矩阵的数量

问题描述
小M最近在研究矩阵,他对矩阵中的子矩阵很感兴趣。给定一个矩阵 matrix 和一个目标值 target,他的任务是找到所有总和等于目标值的非空子矩阵的数量。子矩阵通过选择矩阵的某个矩形区域定义,形式为 (x1, y1, x2, y2),其中 (x1, y1) 表示左上角的坐标,(x2, y2) 表示右下角的坐标。一个子矩阵包含矩阵中所有位于这个矩形区域内的单元格。如果两个子矩阵的坐标不同(如 x1 != x1’ 或 y1 != y1’),则这两个子矩阵被认为是不同的。
你需要返回满足条件的子矩阵数量。

测试样例

样例1:

输入:matrix = [[-1,1,0], [1,1,1], [0,1,0]] ,target = 0
输出:7

样例2:

输入:matrix = [[-1,-1], [-1,1]] ,target = 0
输出:2

样例3:

输入:matrix = [[-1,2,3], [4,5,6], [7,8,9]] ,target = 10
输出:2

题解

二维前缀和,枚举左上角的点和右下角的点。时间复杂度O(n^2 * m^2)

#include <iostream>
#include <vector>
using namespace std;int solution(vector<vector<int>>& matrix, int target) {// PLEASE DO NOT MODIFY THE FUNCTION SIGNATURE// write code hereint n = matrix.size();int m = matrix[0].size();vector<vector<int>> ans(n+1, vector<int>(m+1, 0));int res = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {ans[i+1][j+1] = matrix[i][j] + ans[i][j+1] + ans[i+1][j] - ans[i][j];}}for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {for (int r = i ; r < n; r++) {for (int c = j ; c < m; c++) {int tmp = ans[r+1][c+1] - ans[r+1][j] - ans[i][c+1] + ans[i][j];if (target == tmp) {res++;}}}}}return res;
}
优化枚举左上点和右下点的枚举。使用前缀和+ 哈希表进行优化。
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;int solution(vector<vector<int>>& matrix, int target) {// PLEASE DO NOT MODIFY THE FUNCTION SIGNATURE// write code hereint n = matrix.size();int m = matrix[0].size();vector<vector<int>> ans(n+1, vector<int>(m+1, 0));int res = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {ans[i+1][j+1] = matrix[i][j] + ans[i][j+1] + ans[i+1][j] - ans[i][j];}} // top代表左上点的行号for (int top = 0; top< n; top++) {// bottom 代表右下点的行号for (int bottom = top; bottom < n; bottom ++) {// 存储前缀和的数量unordered_map<int, int> sumCount;sumCount[0] = 1;for (int col = 0; col < m; col++) {// 这里计算出来的就是[top][col] - [bottom][col]的值int currentSum = ans[bottom+1][col+1] - ans[top][col+1];// prefix[i−1]=prefix[j]−target 这个公式的提现if (sumCount.find(currentSum-target) != sumCount.end()) {res += sumCount[currentSum-target];}sumCount[currentSum]++;}}}return res;
}

http://www.ppmy.cn/ops/149282.html

相关文章

adb remount 重新挂载 system时报错 Device or resource busy

问题&#xff1a; android 7.1.2系统中 system 属于只读权限&#xff0c;选用更改成读写权限。 操作&#xff1a;使用一下3个步骤后报错Device or resource busy。 1. adb shell 2. su 3. mount -o remount,rw /system 解决方案&#xff1a;执行以下5个步…

Ruby语言的软件开发工具

Ruby语言的软件开发工具概述 引言 Ruby是一种简单且功能强大的编程语言&#xff0c;它以优雅的语法和灵活性而闻名。自1995年首次发布以来&#xff0c;Ruby已经被广泛应用于各种开发领域&#xff0c;特别是Web开发。随着Ruby语言的普及&#xff0c;相关的开发工具也日益丰富。…

CAN总线入门指南:从原理到实践

1 CAN通信基础概述 CAN&#xff08;Controller Area Network&#xff09;是一种串行通信协议&#xff0c;由德国BOSCH公司于1986年专门为汽车分布式控制系统开发。它最初的目标是减少汽车中的线束数量&#xff0c;降低整车重量和成本。经过30多年的发展&#xff0c;CAN已经成为…

嵌入式驱动开发详解9(platform驱动)

文章目录 前言platform简介总线驱动设备设备树下的platform驱动在设备树中创建设备节点编写 platform 驱动 后续参考文献 前言 Linux 系统要考虑到驱动的可重用性&#xff0c;提出了驱动的分离与分层这样的软件思路&#xff0c;在这个思路下诞生了我们最常打交道的 platform 设…

初学stm32 --- adc光敏传感器

光敏二极管简介 1&#xff0c;光敏二极管 核心是一个PN结&#xff0c;对光强非常敏感&#xff0c;单向导电性&#xff0c;工作时需加反向电压 2&#xff0c;暗电流 无光照时&#xff0c;反向电流很小&#xff08;一般小于0.1微安&#xff09;&#xff0c;称为暗电流 3&#…

AWS Control Tower基础知识

1.多账户策略 Account Vending&#xff1a;AWS Control Tower 使用 AWS Organizations 自动执行创建新账户的过程。这包括创建具有预定义防护机制 &#xff08;策略&#xff09; 的账户。组织单位 &#xff08;OU&#xff09;&#xff1a;Control Tower 利用 AWS Organization…

贪心算法(五)

目录 一、单调递增的数字 二、坏了的计算器 三、合并区间 四、无重叠区间 五、用最少数量的箭引爆气球 一、单调递增的数字 单调递增的数字 贪心策略&#xff1a; 对于这道题&#xff0c;相邻数字相等&#xff0c;也表示是递增的。 解题代码&#xff1a; class Soluti…

element-ui下拉输入框+resetFields无法回显

文章目录 描述原因问题重现解决方案方法一方法二 总结 描述 第一次进入页面&#xff0c;不做任何操作&#xff0c;点击重置按钮&#xff0c;再进行下拉选择&#xff0c;输入框并不能回显数据&#xff0c;点击搜索后&#xff0c;选中的数据就能显示出来。 重置代码&#xff0c;…