(力扣)1314.矩阵区域和

给你一个 m x n 的矩阵 mat 和一个整数 k ,请你返回一个矩阵 answer ,其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和:

  • 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 == mat[i].length
  • 1 <= m, n, k <= 100
  • 1 <= mat[i][j] <= 100

此题可以用前缀和来做,但是比较难点儿的是边界不好控制!!接下来看看代码吧~

cpp 复制代码
class Solution {
public:
vector<vector<int>> sums;
    vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {
        int rlen=mat.size(),clen=mat[0].size();
        sums.resize(rlen+1,vector<int>(clen+1));//初始化空间
        for(int i=1;i<=rlen;i++){
            for(int j=1;j<=clen;j++){
                sums[i][j]=sums[i-1][j]+sums[i][j-1]-sums[i-1][j-1]+mat[i-1][j-1];//求前缀和
            }
        }
        vector<vector<int>> res(rlen,vector<int>(clen));//此处一定要初始化空间,否则报空指针
        for(int i=0;i<rlen;i++){
            for(int j=0;j<clen;j++){
                // 分别获取左上角和右下角的坐标
                int r1=max(i-k,0),c1=max(j-k,0);
                int r2=min(i+k,rlen-1),c2=min(j+k,clen-1);
                // 通过二维前缀和公式获取某个区间内的和
                res[i][j]=sums[r2+1][c2+1]-sums[r2+1][c1]-sums[r1][c2+1]+sums[r1][c1];
            }
        }
        return res;
    }
};

提交通过!

相关推荐
京东零售技术4 分钟前
SIGIR 2025 | 基于图同构网络的群体建模在点击率预测中的应用
算法
程序员西西12 分钟前
深入剖析 Java 中的 ZGC 机制:原理、优势与实践
java·后端·算法
月明长歌14 分钟前
【码道初阶】Leetcode.189 轮转数组:不熟悉ArrayList时踩得坑,被Arraylist初始化骗了?
java·算法·leetcode·职场和发展
卡尔AI工坊16 分钟前
万众瞩目的 GPT 5.2,连个火柴人游戏都做不明白?
后端·算法
fantasy_arch17 分钟前
leetcode算法-最大乘积子数组
算法·leetcode·职场和发展
Ivy_belief24 分钟前
C++新特性汇总:涵盖C++11到C++23
java·c++·c++11·c++23
dragoooon3429 分钟前
[hot100 NO.8~12]
算法
koddnty33 分钟前
在c++中使用HOOK修改sleep函数
linux·c++
kaikaile199540 分钟前
MATLAB计算卫星星下点轨迹
开发语言·算法·matlab
_OP_CHEN43 分钟前
【算法基础篇】(三十一)动态规划之基础背包问题:从 01背包到完全背包,带你吃透背包问题的核心逻辑
算法·蓝桥杯·动态规划·背包问题·01背包·完全背包·acm/icpc