【剑斩OFFER】算法的暴力美学——矩阵区域和

一、题目描述

二、算法原理

我们一看题目就知道使用二维数组的前缀和来解决这道题目。

所谓二维数组的前缀和就是某个二维数组某个区域的和:https://blog.csdn.net/2403_84958571/article/details/154848877?spm=1011.2415.3001.10575&sharefrom=mp_manage_link

所以我们得出二维数组的前缀和:

那么怎么使用这个前缀和呢?

根据题目要求:我们是求 i 和 j 在 i - k <= r <= i + k,j - k <= c <= j + k 的区域和。

例如:当 i = 1,j = 1,k = 1时:0 <= r <= 2,0 <= c <= 2,所以是求(0,0)到 (2,2)的区域和,又因为这个区域内的纵和横坐标是不可能是小于等于0,因为我们的前缀和数组是从(1,1)开始的,所以我们当纵和横坐标小于等于0时直接等于1。

因为我们横坐标是不可能大于二维数组的横长度,所以当大于这个长度时,就让他等于这个最大的长度。

怎么求区域内的和:前面链接的那篇博客也说过了。

注意:我们返回的数组的原数组的长度的。

三、代码实现

cpp 复制代码
class Solution {
public:
    vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {
        vector<vector<int>> ret(mat.size() + 1,vector<int>(mat[0].size() + 1));
        for(int i = 1; i <= ret.size() - 1; i++)
        {
            for(int j = 1; j <= ret[0].size() - 1; j++)
            {
                ret[i][j] = ret[i -1][j] + ret[i][j - 1] - ret[i - 1][j - 1] + mat[i - 1][j - 1];
            }
        }

        int x1, y1, x2, y2;
        x1 = y1 = x2 = y2 = 0;
        vector<vector<int>> left(mat.size(), vector<int>(mat[0].size()));
        for (int i = 1; i <= ret.size() - 1; i++)//return 是前缀不是0的,哪个
        {
            for (int j = 1; j <= ret[0].size() - 1; j++)
            {
                x1 = i - k <= 0 ? 1 : i - k;
                y1 = j - k <= 0 ? 1 : j - k;
                x2 = i + k >= ret.size() - 1 ? ret.size() - 1 : i + k;
                y2 = j + k >= ret[0].size() - 1 ? ret[0].size() - 1 : j + k;
    
                left[i - 1][j - 1] = ret[x2][y2] - ret[x1 - 1][y2] - ret[x2][y1 - 1] + ret[x1 - 1][y1 - 1];
            }
        }
        return left;
    }
};
相关推荐
CoderCodingNo1 小时前
【GESP】C++五级练习题 luogu-P1865 A % B Problem
开发语言·c++·算法
大闲在人1 小时前
7. 供应链与制造过程术语:“周期时间”
算法·供应链管理·智能制造·工业工程
小熳芋1 小时前
443. 压缩字符串-python-双指针
算法
Charlie_lll1 小时前
力扣解题-移动零
后端·算法·leetcode
chaser&upper1 小时前
矩阵革命:在 AtomGit 解码 CANN ops-nn 如何构建 AIGC 的“线性基石”
程序人生·算法
weixin_499771551 小时前
C++中的组合模式
开发语言·c++·算法
iAkuya2 小时前
(leetcode)力扣100 62N皇后问题 (普通回溯(使用set存储),位运算回溯)
算法·leetcode·职场和发展
近津薪荼2 小时前
dfs专题5——(二叉搜索树中第 K 小的元素)
c++·学习·算法·深度优先
xiaoye-duck2 小时前
吃透 C++ STL list:从基础使用到特性对比,解锁链表容器高效用法
c++·算法·stl
松☆2 小时前
CANN与大模型推理:在边缘端高效运行7B参数语言模型的实践指南
人工智能·算法·语言模型