优选算法——前缀和(3):寻找数组的中心下标

🔥近津薪荼: 个人主页 🎬个人专栏: 《近津薪荼的算法日记》 《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优解

这道题目还是求连续区区间的和 ,可以考虑使用前缀和

将前缀和数组创建好之后,将**dpi-1与dpn-dpi**做比较即可。

一维前缀和的递推公式也是老生常谈了,这边就不打了。注意这里的前缀和数组是要求到所有元素的和的。

这题的特殊之处在于,我们不仅可以使用前缀和,也可以使用"后缀和"

求出两个dp数组:front和back,最终比较fronti与backi是否相等即可。

注意:两个dp数组的长度都是n。要求的是前i-1或者后n-i个元素的和,和上边的

下边就要求两个dp数组的求和递推公式了,front和上边的前缀和方法的递推公式一样,back就要处理一下,但是逻辑也是一样,的大家自己求哈。

代码逻辑

  • 创建前后缀和数组
  • 用公式初始化
  • 比较front i 与back i 是否相等

5.下期要讲解的题目是:

除了自身以外数组的乘积

6.嗟食

如果小编写的内容对佬有帮助,还请大佬点点三连加关注哦
佬的支持就是我前进的最大动力 ~
期待与佬的再次相遇~

相关推荐
起个破名想半天了6 小时前
算法与数据结构之DFS深度优先遍历
数据结构·算法·深度优先
李伟_Li慢慢6 小时前
凸包算法
人工智能·算法
徐礼昭|商派软件市场负责人6 小时前
AI Agent 蜂群协作与经验基因化:从单体执行到自组织系统的工程路径
大数据·人工智能·算法·智能体·多agent
来者皆善6 小时前
【位RAW图像处理五】任意位深位图像的中值模糊快速实现及其应用。
图像处理·人工智能·算法
happyprince6 小时前
第三观 · 深刻不忘观 —— AngelSpec 哲学与升华
人工智能·算法
脚踏实地皮皮晨6 小时前
003002004_WPF Panel 基类 官方类定义
开发语言·windows·算法·c#·wpf·visual studio
啊真真真7 小时前
ArgoCD:我的GitOps探索之旅与未来展望
java·算法·argocd
就改了14 小时前
Java8 日期处理(详细版)
java·python·算法
2601_9583529015 小时前
接上USB,焊上麦,通话瞬间安静——WX-0813如何用AI降噪+100dB消回音,把嘈杂通话变成“金子“般清晰
人工智能·算法·语音识别·硬件开发·语音模块·降噪消回音
小蒋学算法16 小时前
算法-M个非重叠子数组最大和II-WQS二分学习
数据结构·学习·算法