★ 算法OJ题 ★ 前缀和算法(上)

Ciallo~(∠・ω< )⌒☆ ~ 今天,将和大家一起做几道前缀和算法题 ~

❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️

澄岚主页: 椎名澄嵐-CSDN博客

算法专栏: ★ 优选算法100天 ★_椎名澄嵐的博客-CSDN博客

❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️


目录

[壹 【模板】一维前缀和](#壹 【模板】一维前缀和)

[1.1 题目](#1.1 题目)

[1.2 算法解析](#1.2 算法解析)

[1.3 撰写代码](#1.3 撰写代码)

[贰 【模板】二维前缀和](#贰 【模板】二维前缀和)

[2.1 题目](#2.1 题目)

[2.2 算法解析](#2.2 算法解析)

[2.3 撰写代码](#2.3 撰写代码)

[叁 寻找数组的中心下标](#叁 寻找数组的中心下标)

[3.1 题目](#3.1 题目)

[3.2 算法解析](#3.2 算法解析)

[3.3 撰写代码](#3.3 撰写代码)

[肆 除自身以外数组的乘积](#肆 除自身以外数组的乘积)

[4.1 题目](#4.1 题目)

[4.2 算法解析](#4.2 算法解析)

[4.3 撰写代码](#4.3 撰写代码)


壹 【模板】一维前缀和

1.1 题目

【模板】前缀和_牛客题霸_牛客网

1.2 算法解析

1.3 撰写代码

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

int main() 
{
    // 读取数据
    int n, q;
    cin >> n >> q;
    vector<int> arr(n + 1);
    for (int i = 1; i <= n; i++) cin >> arr[i];
    // 预处理前缀和数组
    vector<long long> dp(n + 1);
    for (int i = 1; i <= n; i++) dp[i] = dp[i - 1] + arr[i];//此处有溢出风险
    // 使用前缀和数组
    int l = 0, r = 0;
    while(q--)
    {
        cin >> l >> r;
        cout << dp[r] - dp[l - 1] << endl;
    }
    return 0;
}

贰 【模板】二维前缀和

2.1 题目

【模板】二维前缀和_牛客题霸_牛客网

2.2 算法解析

2.3 撰写代码

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

int main() 
{
    // 读入数据
    int n = 0 , m = 0, q = 0;
    cin >> n >> m >> q;
    vector<vector<int>> arr(n + 1, vector<int>(m + 1));
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            cin >> arr[i][j];
    // 预处理前缀和矩阵
    vector<vector<long long>> dp(n + 1, vector<long long>(m + 1));
    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 = 0, x2 = 0, y1 = 0, 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;
}

叁 寻找数组的中心下标

3.1 题目

724. 寻找数组的中心下标 - 力扣(LeetCode)

3.2 算法解析

3.3 撰写代码

cpp 复制代码
class Solution {
public:
    int pivotIndex(vector<int>& nums) 
    {
        int n = nums.size();
        vector<int> f(n);
        vector<int> g(n);
        // 预处理前缀和数组和后缀和数组
        for (int i = 1; i < n; i++)
            f[i] = f[i - 1] + nums[i - 1];
        for (int i = n - 2; i >= 0; i--)
            g[i] = g[i + 1] + nums[i + 1];
        // 使用前缀和数组和后缀和数组
        for (int i = 0; i < n; i++)
            if(f[i] == g[i])
                return i;
        return -1;
    }
};

肆 除自身以外数组的乘积

4.1 题目

238. 除自身以外数组的乘积 - 力扣(LeetCode)

4.2 算法解析

4.3 撰写代码

cpp 复制代码
class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) 
    {
        int n = nums.size();
        vector<long long> f(n), g(n);
        // 预处理前缀积和后缀积
        f[0] = g[n - 1] = 1;
        for (int i = 1; i <= n - 1; i++)
            f[i] = f[i - 1] * nums[i - 1];
        for (int i = n - 2; i >= 0; i--)
            g[i] = g[i + 1] * nums[i + 1];
        // 使用前缀积和后缀积
        vector<int> ret(n);
        for (int i = 0; i <= n - 1; i++)
            ret[i] = f[i] * g[i];
        return ret;
    }
};

~ 完 ~

相关推荐
虾球xz22 分钟前
游戏引擎学习第268天:合并调试链表与分组
c++·学习·链表·游戏引擎
fpcc1 小时前
跟我学c++高级篇——模板元编程之十三处理逻辑
c++
格林威2 小时前
Baumer工业相机堡盟工业相机的工业视觉中为什么偏爱“黑白相机”
开发语言·c++·人工智能·数码相机·计算机视觉
橙子199110162 小时前
在 Kotlin 中什么是委托属性,简要说说其使用场景和原理
android·开发语言·kotlin
蓝婷儿2 小时前
前端面试每日三题 - Day 32
前端·面试·职场和发展
androidwork2 小时前
Kotlin Android LeakCanary内存泄漏检测实战
android·开发语言·kotlin
学地理的小胖砸2 小时前
【Python 基础语法】
开发语言·python
程序员小远2 小时前
自动化测试与功能测试详解
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
Dream it possible!2 小时前
LeetCode 热题 100_只出现一次的数字(96_136_简单_C++)(哈希表;哈希集合;排序+遍历;位运算)
c++·leetcode·位运算·哈希表·哈希集合
?abc!3 小时前
缓存(5):常见 缓存数据淘汰算法/缓存清空策略
java·算法·缓存