LeetCode—1074. 元素和为目标值的子矩阵数量(Number of ...)[困难]—分析及代码(Java)

博客介绍了如何解决LeetCode上的1074题,即找出矩阵中元素和为目标值的子矩阵数量。通过转化为一维数组,使用前缀和与哈希表的方法来优化求解,最终代码在Java实现中取得了良好的运行时间和内存效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LeetCode——1074. 元素和为目标值的子矩阵数量[Number of Submatrices That Sum to Target][困难]——分析及代码[Java]

一、题目

给出矩阵 matrix 和目标值 target,返回元素总和等于目标值的非空子矩阵的数量。

子矩阵 x1, y1, x2, y2 是满足 x1 <= x <= x2 且 y1 <= y <= y2 的所有单元 matrix[x][y] 的集合。

如果 (x1, y1, x2, y2) 和 (x1’, y1’, x2’, y2’) 两个子矩阵中部分坐标不同(如:x1 != x1’),那么这两个子矩阵也不同。

示例 1:

输入:matrix = [[0,1,0],[1,1,1],[0,1,0]], target = 0
输出:4
解释:四个只含 0 的 1x1 子矩阵。

示例 2:

输入:matrix = [[1,-1],[-1,1]], target = 0
输出:5
解释:两个 1x2 子矩阵,加上两个 2x1 子矩阵,再加上一个 2x2 子矩阵。

示例 3:

输入:matrix = [[904]], target = 0
输出:0

提示:

  • 1 <= matrix.length <= 100
  • 1 <= matrix[0].length <= 100
  • -1000 <= matrix[i] <= 1000
  • -10^8 <= target <= 10^8

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-submatrices-that-sum-to-target
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、分析及代码

1. 转化为一维 + 前缀和 + 哈希表

(1)思路

首先通过在矩阵中枚举上下边界,并统计区间内各列的和值,将二维问题转化为求解各列和值数组中和为目标值的区间数量。
在此基础上结合前缀和方法求解,设区间 [0, k] 前缀和为 preSum[k],则区间 [k’, k] 的和为 preSum[k] - preSum[k’ - 1],求解目标 preSum[k] - preSum[k’ - 1] = target 转化为 preSum[k] - target = preSum[k’ - 1]。
为在 O(1) 时间内判断 preSum[k’ - 1] 是否存在并得到其数量,可设计一个哈希表,存储已计算得到的 preSum 及其数量。

(2)代码

class Solution {
   
   
    public int numSubmatrixSumTarget(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值