【前缀和】矩阵区域和(medium)

矩阵区域和(medium)

题⽬描述:

题⽬链接:1314. 矩阵区域和

给你⼀个 m x n 的矩阵 mat 和⼀个整数 k ,请你返回⼀个矩阵 answer ,其中每个 answerij 是所有满⾜下述条件的元素 matrc 的和:

• i - k <= r <= i + k,

• j - k <= c <= j + k 且

• (r, c) 在矩阵内。
⽰例 1:

输⼊:mat = \[1,2,3,4,5,6,7,8,9], k = 1

输出:\[12,21,16,27,45,33,24,39,28]
⽰例 2:

输⼊:mat = \[1,2,3,4,5,6,7,8,9], k = 2

输出:\[45,45,45,45,45,45,45,45,45]
提⽰:

m = = mat.length

n = = mati.length

1 <= m, n, k <= 100

1 <= matij <= 100

解法:

算法思路:

⼆维前缀和的简单应⽤题,关键就是我们在填写结果矩阵的时候,要找到原矩阵对应区域的「左上⻆」以及「右下⻆」的坐标(推荐⼤家画图)

左上⻆坐标: x1 = i - k,y1 = j - k ,但是由于会「超过矩阵」的范围,因此需要对 0

取⼀个 max 。因此修正后的坐标为: x1 = max(0, i - k), y1 = max(0, j - k) ;

右下⻆坐标: x1 = i + k,y1 = j + k ,但是由于会「超过矩阵」的范围,因此需要对 m

  • 1 ,以及 n - 1 取⼀个 min 。因此修正后的坐标为: x2 = min(m - 1, i + k),
    y2 = min(n - 1, j + k) 。
    然后将求出来的坐标代⼊到「⼆维前缀和矩阵」的计算公式上即可~(但是要注意下标的映射关系)
    !!\[在这里插入图片描述(https://i-blog.csdnimg.cn/direct/62e1f6f110f14ec98b6257dd19da3768.png)

代码

Java 算法代码:

c 复制代码
class Solution {
 public int[][] matrixBlockSum(int[][] mat, int k) {
 int m = mat.length, n = mat[0].length;
 // 1. 预处理前缀和矩阵
 int[][] dp = new int[m + 1][n + 1];//方便处理边界情况
 for(int i = 1; i <= m; i++)
 	for(int j = 1; j <= n; j++)
 		dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + mat[i - 1][j - 1];//注意不是+mat[i][j]
 
 // 2. 使⽤
 int[][] ret = new int[m][n];
 for(int i = 0; i < m; i++)
	 for(int j = 0; j < n; j++)
	 {
	 int x1 = Math.max(0, i - k) + 1, y1 = Math.max(0, j - k) + 1;
	 int x2 = Math.min(m - 1, i + k) + 1, y2 = Math.min(n - 1, j + k) + 1;
	 ret[i][j] = dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1];
	 }
 	 return ret;
 }
}

C++ 算法代码:

c 复制代码
class Solution {
public:
 vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {
 int m = mat.size(), n = mat[0].size();
 vector<vector<int>> dp(m + 1, vector<int>(n + 1));
 // 1. 预处理前缀和矩阵
 for(int i = 1; i <= m; i++)
 for(int j = 1; j <= n; j++)
 dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + mat[i - 1][j - 1];
 
 // 2. 使⽤
 vector<vector<int>> ret(m, vector<int>(n));
 for(int i = 0; i < m; i++)
 for(int j = 0; j < n; j++)
 {
 int x1 = max(0, i - k) + 1, y1 = max(0, j - k) + 1;
 int x2 = min(m - 1, i + k) + 1, y2 = min(n - 1, j + k) + 1;
 ret[i][j] = dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1];
 }
 return ret;
 }
};
相关推荐
非优秀程序员10 小时前
第05章 播放器大战,暴风、快播与那一夜|《互联网产品恩仇录》
算法
非优秀程序员10 小时前
第04章 邮箱大战,163 与 QQ 的暗战|《互联网产品恩仇录》
java·vue.js·架构
知已难寻10 小时前
Docker 入门:容器技术与 Docker 基础
java·运维·服务器·docker·云原生·容器
文丑颜不良啊12 小时前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang13 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
聪明的笨猪猪14 小时前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
愿有所息14 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
秋饼14 小时前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
SL_staff16 小时前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈