C++ 前缀和

目录

例1

例2

例3

例4

例5

例6

例7

例8


例1

DP34 【模板】前缀和

分析:dp和arr的大小并不是固定的,就是有没有偏移量,这里的n是从1开始,不如直接放到下标1处,在最后的减法时,如果用第一个参考代码会下标越界到-1,所以说这里的方法并不是固定的,思路,偏移量理清了静下心就可以上手写

注意:a[i] 的最大值是INT_MAX,所以创建long long 类型的dp表

参考代码:dp[n + 1],arr[n + 1]

#include <iostream>
using namespace std;
#include <vector>
int main() {int n = 0, q = 0;cin >> n >> q;vector<int> arr(n + 1);for(int i = 1; i < n + 1; i++)cin >> arr[i];vector<long long> dp(n + 1);for(int i = 1; i < n + 1; 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;
}
// 64 位输出请用 printf("%lld")

参考代码: dp[n],arr[n]

#include <iostream>
using namespace std;
#include <vector>
int main() {int n = 0, q = 0;cin >> n >> q;vector<int> arr(n);for(int i = 0; i < n; i++)cin >> arr[i];vector<long long> dp(n);dp[0] = arr[0];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 - 1] - dp[l - 1] + arr[l - 1] << endl;}return 0;
}
// 64 位输出请用 printf("%lld")

参考代码:dp[n],arr[n + 1]

#include <iostream>
using namespace std;
#include <vector>
int main() {int n = 0, q = 0;cin >> n >> q;vector<int> arr(n + 1);for(int i = 1; i <= n; i++)cin >> arr[i];vector<long long> dp(n);dp[0] = arr[1];for(int i = 1; i < n; i++)dp[i] = dp[i - 1] + arr[i + 1];int l = 0, r = 0;while(q--){cin >> l >> r;cout << dp[r - 1] - dp[l - 1] + arr[l] << endl;}return 0;
}
// 64 位输出请用 printf("%lld")

例2

DP35 【模板】二维前缀和

 

dp和原数组对齐了,就没有偏移量

注意:a[i][j] 的最大值是INT_MAX,所以创建long long 类型的dp表

参考代码

#include <iostream>
using namespace std;
#include <vector>
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 + 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));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];while(q--){int x1 = 0, y1 = 0, x2 = 0, y2 = 0;cin >> x1 >> y1 >> x2 >> y2;cout << dp[x2][y2] - dp[x2][y1 - 1] - dp[x1 - 1][y2] + dp[x1 - 1][y1 - 1] << endl; }return 0;
}

例3

724. 寻找数组的中心下标

 要点:f[i] = f[i - 1] + nums[i - 1];就是看后面的nums,如果是i - 1,就是不包括自己的前缀和f[0]自然是0,这题包不包括都可以,包括就是等式两边同时加上自己这个元素,

参考代码

class Solution {
public:int pivotIndex(vector<int>& nums) {int n = nums.size();vector<int> f(n), 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

238. 除自身以外数组的乘积

注意点:f[0] = 1, g[n - 2] = 1

参考代码

class Solution {
public:vector<int> productExceptSelf(vector<int>& nums) {int n = nums.size();vector<int> f(n), g(n), ret(n);f[0] = g[n - 1] = 1;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++)ret[i] = f[i] * g[i];return ret;}
};

例5

560. 和为 K 的子数组

可以不用前缀和,因为这里不需要用到下标随机访问,这里只需要顺序访问

这里不可以用滑动窗口:因为没有单调性

把有的sum都放到哈希表里就行,先判断 : hash.count(sum)   再放入哈希表

注意:这里有个hash[0] = 1,sum = k时候也是符合条件,但是哈希表里没有hash[0],(但是之后是会可能会添加上hash[0],就是中间有个地方前缀和为0),总的来说就是少了一个起点0

参考代码

class Solution {
public:int subarraySum(vector<int>& nums, int k) {// int n = nums.size(), ret = 0;// vector<int> dp(n);// dp[0] = nums[0];// for(int i = 1; i < n; i++)//     dp[i] = dp[i - 1] + nums[i];// unordered_map<int, int> hash;// hash[0] = 1;// for(auto e : dp)// {//     if(hash.count(e - k)) ret += hash[e - k];//hash[e - k]//     hash[e]++;// }// // for(int i = 0; i < n; i++)// // {// //     if(hash.count(dp[i] - k)) ret += hash(dp[i] - k);// //     hash[dp[i]]++;// // }// return ret;unordered_map<int, int> hash;hash[0] = 1;int sum = 0, ret = 0;for(int i = 0; i < nums.size(); i++){sum += nums[i];if(hash.count(sum - k)) ret += hash[sum - k];hash[sum]++;}return ret;}
};

例6

974. 和可被 K 整除的子数组

参考代码

class Solution {
public:int subarraysDivByK(vector<int>& nums, int k) {unordered_map<int, int> hash;hash[0] = 1;int sum = 0, ret = 0;for(int i = 0; i < nums.size(); i++){sum += nums[i];if(hash.count((sum % k + k) % k)) ret += hash[(sum % k + k) % k];hash[(sum % k + k) % k]++;}return ret;}
};

例7

525. 连续数组

题解:把0 改成 -1,之后求和为0的最长子数组,有负数,自然不能用滑动窗口

因为求的是长度吗,那么这里就是最短索引和前缀和的映射,<前缀和,最小索引>

因为是顺序遍历 ,那么不存在就添加进哈希表,这样就可以得到最小索引,既可以不用dp表,也直接找到最小索引

注意:这样就可以理解为什么是i - hash[sum]

参考代码

class Solution 
{
public:int findMaxLength(vector<int>& nums) {unordered_map<int, int> hash;int sum = 0, ret = 0;hash[0] = -1;// for(auto e : nums)// {//     sum += e == 0 ? -1 : e;//     if(hash.count(sum)) ret = max(ret, );//     else hash[sum]++;// }for(int i = 0; i < nums.size(); i++){sum += nums[i] == 0 ? -1 : 1;if(hash.count(sum)) ret = max(ret, i - hash[sum]);else hash[sum] = i;}return ret;}
}; 

例8

1314. 矩阵区域和

分析:涉及偏移量,和对越界的处理,如果二维dp不是 行列 + 1那么边界情况就麻烦了,一维dp若不是n + 1 只有开头或者结尾处理,

偏移:mat 到dp 的偏移,dp 到 ret的偏移

注意:int x2 = min(i + k, m - 1) + 1, y2 = min(j + k, n - 1) + 1;我在写的时候错在不是m - 1

参考代码

class Solution {
public:vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {int m = mat.size(), n = mat[0].size();vector<vector<int>> dp(m + 1, vector<int>(n + 1));for(int i = 1; i < m + 1; i++)for(int j = 1; j < n + 1; j++)dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + mat[i - 1][j - 1];vector<vector<int>> ret(m, vector<int>(n));for(int i = 0; i < m; i++)for(int j = 0; j < n; j++){int x1 = max(i - k, 0) + 1, y1 = max(j - k, 0) + 1;int x2 = min(i + k, m - 1) + 1, y2 = min(j + k, n - 1) + 1;ret[i][j] = dp[x2][y2] - dp[x2][y1 - 1] - dp[x1 - 1][y2] + dp[x1 - 1][y1 - 1];}return ret;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/506366.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言中的字符魔法:大小写转换的艺术

引言 在C语言的世界里&#xff0c;字符处理是一项基础且重要的任务。字符作为编程中最基本的元素之一&#xff0c;承担着信息展示、数据交互等多重角色。特别是在处理文本信息时&#xff0c;字符的转换和识别显得尤为重要。大小写字母的转换就是其中一个常见的需求&#xff0c…

P4913 【深基16.例3】二叉树深度题解

题目 有一个n(n≤) 个结点的二叉树。给出每个结点的两个子结点编号&#xff08;均不超过n&#xff09;&#xff0c;建立一棵二叉树&#xff08;根节点的编号为1&#xff09;&#xff0c;如果是叶子结点&#xff0c;则输入0 0。 建好这棵二叉树之后&#xff0c;请求出它的深度…

【解决】虚幻导入FBX模型不是一个整体

问题&#xff1a; 现在有一个汽车的fbx模型&#xff0c;导入虚幻引擎&#xff0c;导入后变成了很多汽车零件模型。 解决&#xff1a; 把“合并网格体”勾选上&#xff0c;解决问题。

三层靶机靶场之环境搭建

下载&#xff1a; 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;f4as 简介 2019某CTF线下赛真题内网结合WEB攻防题库&#xff0c;涉 及WEB攻击&#xff0c;内网代理路由等技术&#xff0c;每台服务器存在一个 Flag&#xff0c;获取每一 个Flag对应一个积分&…

PDF 解析问题调研

说点真实的感受 &#xff1a;网上看啥组件都好&#xff0c;实际测&#xff0c;啥组件都不行。效果好的不开源收费&#xff0c;开源的效果不好。测试下来&#xff0c;发现把组件融合起来&#xff0c;还是能不花钱解决问题的&#xff0c;都是麻烦折腾一些。 这里分享了目前网上能…

LeetCode 刷题 [C++] 第55题.跳跃游戏

题目描述 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 题目分析 题目中…

【IDEA+通义灵码插件】实现属于你的大模型编程助手

目录 1.前言 2.下载安装 3.解释代码 4.生成单元测试 5.生成注释 6.智能补全 1.前言 大模型到底该以一种什么方式落地&#xff0c;从而嵌入我们的工作当中&#xff0c;助力我们工作效率的提升&#xff0c;其实最好的方式也许就是虚拟助手的方式&#xff0c;就像钢铁侠的&…

ABAP-CPI: Get CPI Monitoring Log (通过postman去获取CPI监控中心的日志)

参照文档: SAP Business Accelerator Hub Using Message Monitoring and Logging (sap.com) 进入到你的CPI监控中心: 获取到上面的 https://..hana.ondemand.com的地址,在它后面加上/api/v1 即https://....hana.ondemand.com/api/v1 然后就可以开始postman调用了,文章…

35 Spring整合Elasticsearch

文章目录 Spring整合Elasticsearch引入依赖配置Elasticsearch解决冲突 使用ElasticsearchSpring Data Elasticsearch建立映射关系常用方法添加数据修改数据删除数据搜索数据&#xff08;es核心&#xff09;步骤构造搜索条件 并 应用进行查询使用查询结果 Spring整合Elasticsear…

Sqli-labs靶场第13关详解[Sqli-labs-less-13]

Sqli-labs-Less-13 #手工注入 post传参了 根据题目看&#xff0c;像一个登录页面&#xff0c;尝试使用布尔型盲注测试能否登录网站 1. Username输入a 测试是否会有报错&#xff0c;burp抓包 报错&#xff1a;syntax to use near a) and password() LIMIT 0,1 at line 1 分…

Android studio (一) 新建一个Android项目 编程语言为Java

一、下载Android studio 下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 这里我下载的是2023年的 二、新建项目 选择如下模板。 填写项目名、项目保存位置、编程语言、最低支持Android API的版本、打包编译模式 三、报错Connection refused: no …

力扣1892 页面推荐Ⅱ

力扣1892&#xff0c;页面推荐Ⅱ&#xff0c;为一个社交媒体网站实施一个页面推荐系统。如果页面被user_id的 至少一个朋友喜欢 &#xff0c;而 不被user_id喜欢 &#xff0c;你的系统将 推荐 一个页面到user_id。 目录 题目描述 解题思路 完整代码 优化 题目描述 表&…