> 技术文档 > ★ 算法OJ题 ★ 前缀和算法(上)

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

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

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

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

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

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


目录

壹  【模板】一维前缀和

1.1 题目

1.2 算法解析

1.3 撰写代码

贰  【模板】二维前缀和

2.1 题目

2.2 算法解析

2.3 撰写代码

叁  寻找数组的中心下标

3.1 题目

3.2 算法解析

3.3 撰写代码

肆  除自身以外数组的乘积

4.1 题目

4.2 算法解析

4.3 撰写代码


壹  【模板】一维前缀和

1.1 题目

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

1.2 算法解析

1.3 撰写代码

#include #include using namespace std;int main() { // 读取数据 int n, q; cin >> n >> q; vector arr(n + 1); for (int i = 1; i > arr[i]; // 预处理前缀和数组 vector dp(n + 1); for (int i = 1; i > l >> r; cout << dp[r] - dp[l - 1] << endl; } return 0;}

 


贰  【模板】二维前缀和

2.1 题目

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

2.2 算法解析

2.3 撰写代码

#include #include using namespace std;int main() { // 读入数据 int n = 0 , m = 0, q = 0; cin >> n >> m >> q; vector<vector> arr(n + 1, vector(m + 1)); for (int i = 1; i <= n; i++) for (int j = 1; j > arr[i][j]; // 预处理前缀和矩阵 vector<vector> dp(n + 1, vector(m + 1)); for (int i = 1; i <= n; i++) for (int j = 1; j > 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 撰写代码

class Solution {public: int pivotIndex(vector& nums) { int n = nums.size(); vector f(n); vector g(n); // 预处理前缀和数组和后缀和数组 for (int i = 1; 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 撰写代码

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


~ 完 ~