首页 > 编程语言 >【C++算法】32.前缀和_矩阵区域和

【C++算法】32.前缀和_矩阵区域和

时间:2024-12-06 23:29:42浏览次数:11  
标签:前缀 int 32 矩阵 C++ y1 y2 dp

文章目录


题目链接:

1314. 矩阵区域和


题目描述:

decc7f6a3b3fe63df13a15491690ed86


解法

防止有人看不明白题目,先解释一下题目

e0c5519d6ad0b102dbf0fc432598de35

二维前缀和思想:

使用前缀和矩阵

ret = [x1,y1]~[x2,y2]

= D

= (A+B+C+D)-(A+B)-(A+C)+A

= dp[x2,y2]-dp[x1-1,y2]-dp[x2,y1-1]+dp[x1-1,y1-1]

重要的是怎么找到坐标answer[i][j]

b51872f5f086a410383e9bbd0b954157

这里要注意:是坐标,不是坐标系。

如果是(0,0)的话,比0小的都要舍掉。同理,比结尾大的也要舍掉。

我们可以处理一下:

a24e1df7fea0b926df4d2b85c81736eb

m,n为边界。

还需要注意下标的映射关系。

1d82daaab5fd2d21d9be1878eecb6d35

ma矩阵是以(0,0)开始的,前缀和dp矩阵是以(1,1)开始的。

6ca737f4671d0559511a25969611aff1

dp里面找(x,y)的时候,要(x-1,y-1)才是mat里面的前缀和

answer里面找(x,y)的时候,要(x+1,y+1)才是dp里面的前缀和

所以我们要么改矩阵的面积公式,要么在这里改:

eba9253b8f9a8c06f70797a7eadb4450

这样求到的就是dp表里面的坐标了。

前缀和矩阵 dp[i][j] 表示 mat 中从 (0,0)(i-1,j-1) 矩形区域内的元素之和。

下面的结果矩阵ret就是answer


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;
    }
};

标签:前缀,int,32,矩阵,C++,y1,y2,dp
From: https://blog.csdn.net/hlyd520/article/details/144257905

相关文章

  • 用一篇博文带你了解c++和python两种编程语言到底有什么区别?
      成长路上不孤单......
  • 20222324 石国力 《网络与系统攻防技术》 实验五
    1.实验目的(1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息:·DNS注册人及联系方式·该域名对应IP地址·IP地址注册人及联系方式·IP地址所在国家、城市和具体地理位置PS:使用whois、dig、nslookup、traceroute、以及各类在线和离线工具......
  • C++的继承
    概念在C++中,继承是面向对象编程的一个重要特性,它允许一个类(派生类)从另一个类(基类)继承属性和方法,从而实现代码的重用和扩展。基类(BaseClass):被继承的类。派生类(DerivedClass):从基类派生出的类。-继承类型公有继承(PublicInheritance):派生类可以访问基类的公有成员和保护......
  • 力扣61题 -- 旋转链表(C++)
    文章目录一、题目要求二、思路分析三、代码展示一、题目要求给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。示例1:输入:head=[1,2,3,4,5],k=2输出:[4,5,1,2,3]示例2:输入:head=[0,1,2],k=4输出:[2,0,1]二、思路分析以......
  • leetcode3288 最长上升路径的长度
    给定长度为n的二维数组{x[i],y[i]}和一个整数k,其中0<=k<n,从中选中若干个点排序构成序列,求最长的点序列满足x[i]<x[i+1]并且y[i]<y[i+1],要求第k个点必须选择,返回最长序列的长度。1<=n<=1E5;0<=x[i],y[i]<=1E9;各个点互不相同分析:可以拆分成如下几个子任务:(1)求一维数组的lis的长度......
  • 20222327 2021-2022-2 《网络与系统攻防技术》实验七实验报告
    一、实验内容1.学习内容本周学习了一些Web安全的基础知识以及一些常见的攻击技术。分别从前端和后端总结防护、攻击的重点和方式,学习了如何识别和防范常见的Web安全漏洞。同时还学习了SQL注入的原理,了解了通过恶意SQL语句对数据库进行攻击以做到特殊的目的,并学习了防范SQL注入的......
  • C++——哈希表(Hash Table),附加于 Python 中字典区别于联系
    哈希表(HashTable)是一种非常高效的数据结构,用于存储键值对(key-value)。允许我们以非常快的速度进行插入、删除和查找操作,因为这些操作的时间复杂度平均为O(1)。哈希表通过使用哈希函数将键映射到表中的位置,从而实现快速访问。一、【哈希表的基本概念】1、哈希函数:这是一个将......
  • 洛谷解题日记14||前缀和,差分与离散化
    #include<iostream>#include<vector>#include<algorithm>usingnamespacestd;intmain(){intn;cin>>n;//读取区间的个数nvector<pair<int,int>>intervals(n);//存储区间的起点和终点,使用pair类型//读......
  • c++初识------if-else与复合语句
    上次,我们讲了简单的判断语句,今天,我们讲一些复杂的判断语句。首先,我们讲一个情景:小明在Goc课程上学会了利用pen.r指令来画椭圆,也学会了利用p.oo指令来画实心圆,今天他想利用这两个指令来画眼睛,步骤如下:第1步:画一个宽度半径是100,高度半径是40的椭圆,颜色是1号颜色。第2步:画一......
  • 20222320 2024-2025-1 《网络与系统攻防技术》实验七实验报告
    目录目录目录1.实验目标2.实验内容3.实验过程3.1应用SET工具建立冒名网站3.2ettercaDNSspoof3.3应用两种技术,用DNSspoof引导特定访问到冒名网站。4.问题及解决方案5.学习感悟、思考等1.实验目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法。具体实践有......