🔥近津薪荼: [个人主页] 🎬个人专栏: 《近津薪荼的算法日记》 《Linux操作系统及网络基础知识分享》 《c++基础知识详解》 《c语言基础知识详解》 ✨"百分百死亡率的人生,你还在犹豫什么,犹豫怎么死吗?"
1.上期参考代码
cpp
#include <iostream>
#include<vector>
using namespace std;
int main() {
int n,m,q,x1,x2,y1,y2;
cin >>n>>m>>q;
vector<vector<int>> arr(n+1,vector<int>(m+1,0));
for (int i=1;i<n+1;i++)
{
for(int j=1;j<m+1;j++)
{
cin>>arr[i][j];
}
}
vector<vector<long long >> dp(n+1,vector<long long>(m+1,0));
for (int i=1;i<n+1;i++)
{
for(int j=1;j<m+1;j++)
{
dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+arr[i][j];
}
}//创建dp数组
while(q--)
{
cin >>x1>>y1>>x2>>y2;
cout <<dp[x2][y2]-dp[x2][y1-1]-dp[x1-1][y2]+dp[x1-1][y1-1]<<endl;
}
}
2.本期知识点导图

3.本期要讲解的题目是
寻找数组的中心下标

要点:
- 中心下标:下标指向的元素不算,下标左边所有元素之和与右边所有元素之和相等
- 边界情况
4.解题
4.1 暴力解法:
遍历数组,i为分割下标,分别计算下标左边和右边的元素之和,相等,则下标i就是中心下标,返回即可,找不到返回-1。
时间复杂度O(N2)
4.2优解
这道题目还是求连续区区间的和 ,可以考虑使用前缀和
将前缀和数组创建好之后,将**dp[i-1]与dp[n]-dp[i]**做比较即可。
一维前缀和的递推公式也是老生常谈了,这边就不打了。注意这里的前缀和数组是要求到所有元素的和的。
这题的特殊之处在于,我们不仅可以使用前缀和,也可以使用"后缀和"
求出两个dp数组:front和back,最终比较front[i]与back[i]是否相等即可。
注意:两个dp数组的长度都是n。要求的是前i-1或者后n-i个元素的和,和上边的
下边就要求两个dp数组的求和递推公式了,front和上边的前缀和方法的递推公式一样,back就要处理一下,但是逻辑也是一样,的大家自己求哈。
代码逻辑
- 创建前后缀和数组
- 用公式初始化
- 比较front[ i ]与back[ i ]是否相等
5.下期要讲解的题目是:
除了自身以外数组的乘积
6.嗟食
如果小编写的内容对佬有帮助,还请大佬点点三连加关注哦 
佬的支持就是我前进的最大动力
~
期待与佬的再次相遇~