刷题训练之前缀和(上)

简介: 本文围绕前缀和算法展开,介绍了C++实现的多种经典题型,包括一维和二维前缀和,以及中心下标和子数组和等问题,强调实战学习的重要性,鼓励读者通过刷题提升技能。

> 作者:დ旧言~

> 座右铭:松树千年终是朽,槿花一日自为荣。

> 目标:熟练掌握前缀和算法。

> 毒鸡汤:学习,学习,再学习 ! 学,然后知不足。

> 专栏选自:刷题训练营

> 望小伙伴们点赞👍收藏✨加关注哟💕💕




🌟前言分析

       最早博主续写了牛客网130道题,这块的刷题是让同学们快速进入C语言,而我们学习c++已经有一段时间了,知识储备已经足够了但缺少了实战,面对这块短板博主续写刷题训练,针对性学习,把相似的题目归类,系统的刷题,而我们刷题的官网可以参考:


⭐知识讲解

前缀和只是一个算法的总称,其实前缀和可以分为前缀和,前缀积,这类算法更像是高中我们所学的数列的求和,寻找一组数列的规律,从而计算前缀和,这类题目很有规律的,学会画图,掌握题目的所隐藏的规律,这类题目就自然而然的可以解出。


⭐经典题型

🌙topic-->1

题目链接:1.前缀和



题目分析:

输入  n  个数字 ,求 q 次前缀和,这个 q 次前缀和范围在 l ~ r 之间 (不是数组的下标,而是数组第l 的数),输出多组数据。

算法原理:

  • 解法一:

暴力遍历数组,时间复杂度为O(n * q),这个解法会超时,所以我们不用这个算法。

  • 解法二:

采用前缀和的算法原理:



代码演示:

#include <iostream>
using namespace std;
 
const int N = 100001; // 数据大小
long long arr[N],dp[N];
int n,q; 
 
int main() 
{
    // 输入
    cin >> n >> q;
    // 存入数据
    for(int i = 1;i <= n;i++)
        cin >> arr[i];
    // 前缀和
    for(int i = 1;i <= n;i++)
        dp[i] = dp[i - 1] + arr[i];
    // 输出
    while(q--)
    {
        int l,r = 0;
        cin >> l >> r;
        // 计算前缀和
        cout << dp[r] - dp[l - 1] << endl;
    }
    return 0;
}


🌙topic-->2

题目链接:2二维前缀和



题目分析:

在一个二维数组( n  *  m)中,求 q 次二维前缀和,其中需要输入两个二维坐标,求输入这个两个坐标矩阵的和。

算法原理:

  • 解法一:

暴力遍历二维数组,时间复杂度为O(n * m  * q),这个解法会超时,所以我们不用这个算法。

  • 解法二:

采用二维前缀和的算法原理:



代码演示:

#include <iostream>
using namespace std;
 
const int N = 1001; // 数据大小
int arr[N][N];
long long dp[N][N];
int n,m,q = 0;
 
int main() 
{
    // 输入
    cin >> n >> m >> q;
    // 读入数据
    for(int i = 1 ;i <= n;i++)
        for(int j = 1;j <= m;j++)
            cin >> arr[i][j];
    // 处理数据
    for(int i = 1;i <=n;i++)
        for(int j = 1;j <= m;j++)
            dp[i][j] = dp[i - 1][j] + dp[i][j - 1] + arr[i][j] - dp[i - 1][j - 1];
    // 使用前缀和矩阵
    int x1,y1,x2,y2 = 0;
    while(q--)
    {
        cin >> x1 >> y1 >> x2 >> y2;
        // 采用公式
        cout << dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 -1][y1 - 1] << endl;
    }
 
    return 0;
}


🌙topic-->3

题目链接:3.前缀和



题目分析:

数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。

如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。

算法原理:

  • 解法一:

暴力遍历一维数组,这个解法会超时,所以我们不用这个算法。

  • 解法二:

采用一维前缀和的算法原理:



代码演示:

class Solution {
public:
  int pivotIndex(vector<int>& nums) 
    {
    // lsum[i] 表⽰:[0, i - 1] 区间所有元素的和
    // rsum[i] 表⽰:[i + 1, n - 1] 区间所有元素的和
    int n = nums.size();
    vector<int> lsum(n), rsum(n);
    // 预处理前缀和后缀和数组
    for (int i = 1; i < n; i++)
      lsum[i] = lsum[i - 1] + nums[i - 1];
    for (int i = n - 2; i >= 0; i--)
      rsum[i] = rsum[i + 1] + nums[i + 1];
    // 判断
    for (int i = 0; i < n; i++)
      if (lsum[i] == rsum[i])
        return i;
    return -1;
  }
};


🌙topic-->4

题目链接:4.前缀和



题目分析:

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积

算法原理:

  • 解法一:

暴力遍历一维数组,这个解法会超时,所以我们不用这个算法。

  • 解法二:

采用一维前缀积的算法原理:



代码演示:

class Solution
{
public:
  vector<int> productExceptSelf(vector<int>& nums)
  {
    // lprod 表⽰:[0, i - 1] 区间内所有元素的乘积
    // rprod 表⽰:[i + 1, n - 1] 区间内所有元素的乘积
    int n = nums.size();
    vector<int> lprod(n + 1), rprod(n + 1);
    lprod[0] = 1, rprod[n - 1] = 1;
    // 预处理前缀积以及后缀积
    for (int i = 1; i < n; i++)
      lprod[i] = lprod[i - 1] * nums[i - 1];
    for (int i = n - 2; i >= 0; i--)
      rprod[i] = rprod[i + 1] * nums[i + 1];
    // 处理结果数组
    vector<int> ret(n);
    for (int i = 0; i < n; i++)
      ret[i] = lprod[i] * rprod[i];
    return ret;
  }
};




刷题训练之前缀和(下)   https://developer.aliyun.com/article/1565746

目录
相关文章
|
3月前
|
算法 Java C语言
刷题训练之滑动窗口
本文介绍了如何运用滑动窗口算法解决LeetCode上的多个编程问题,包括查找和数组和满足条件的子数组长度、最长无重复字符子串、连续1的最大长度、调整0的个数以最大化连续1的长度、水果成篮和字母异位词等问题。
34 1
|
3月前
|
机器学习/深度学习 算法 C++
刷题训练之前缀和(下)
本文围绕前缀和算法展开,介绍了C++实现的多种经典题型,包括一维和二维前缀和,以及中心下标和子数组和等问题,强调实战学习的重要性,鼓励读者通过刷题提升技能。
34 0
|
3月前
|
算法 C语言 C++
刷题训练之二分查找
本文详细介绍了二分查找算法,包括其时间复杂度、适用场景(如有序/无序数组),并提供了针对LeetCode上常见题型的解析,包括查找、范围搜索和插入位置等,强调理解和记忆关键模板。
18 0
|
3月前
|
算法 Java C语言
刷题训练之双指针问题
刷题训练之双指针问题
24 0
|
5月前
|
人工智能 算法
基础算法--前缀和与差分
基础算法--前缀和与差分
|
5月前
|
算法
【数据结构与算法】常用算法 前缀和
【数据结构与算法】常用算法 前缀和
|
5月前
|
存储 缓存 算法
【算法训练-动态规划 零】动态规划解题框架
【算法训练-动态规划 零】动态规划解题框架
88 0
|
11月前
|
存储 人工智能 算法
C++基础算法前缀和和差分篇
C++基础算法前缀和和差分篇
|
12月前
|
算法
[蓝桥杯] 递归与递推习题训练
蓝桥杯比赛只有四十天左右啦,最近会按照模块更新一些有关蓝桥杯算法题。学习算法不仅仅是为了参见比赛,更是以后找工作的一个敲门砖。废话不多说,我们直接看题。
69 0
|
存储 移动开发 算法
前缀和算法练习集
前缀和算法练习集
97 0