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.mzph.cn/news/720594.shtml

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

相关文章

rtt的io设备框架面向对象学习-touch设备

目录 1.触摸设备基类2.触摸设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 io设备管理层 4.总结5.使用5.1实例 1.触摸设备基类 此层处于设备驱动框架层。此层的类是抽象类。 在/ components / drivers / include / drivers /touch.h定义了如下touch设备…

Ai学社致力于Ai视觉设计和AI绘画

Ai学社来啦&#xff01;致力于短时间搞定Ai视觉设计、AI绘画。 遍知首席Ai讲师&#xff0c;教大家如何利用Ai迅速提升工作效率&#xff0c;升职加xin&#xff01;目前申请对ai感兴趣的均可以参加&#xff01;免费报名。 招生人数&#xff1a;本批次至少招募100名。招生时间&…

LeetCode-02

225. 用队列实现栈 用两个队列实现栈的功能&#xff0c;思路如下&#xff1a; 往空队列中放新元素把非空队列中的元素依次放入刚才添加了新元素的队列&#xff0c;直到非空队列变为空队列 class MyStack(object):def __init__(self):self.queue1 []self.queue2 []def push(…

【教程】Kotlin语言学习笔记(四)——方法(持续更新)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【Kotlin语言学习】系列文章 第一章 《认识Kotlin》 第二章 《数据类型》 第三章 《数据容器》 第四章 《方法》 文章目录 【…

突发,Anthropic推出突破性Claude 3系列模型,性能超越GPT-4

&#x1f989; AI新闻 &#x1f680; 突发&#xff0c;Anthropic推出突破性Claude 3系列模型 摘要&#xff1a;人工智能创业公司Anthropic宣布推出其Claude 3系列大型语言模型&#xff0c;该系列包括Claude 3 Haiku、Claude 3 Sonnet和Claude 3 Opus三个子模型&#xff0c;旨…

Cesium 自定义Primitive-绘制圆

一、创作来源 1、cesium的entity绘制圆 2、不使用entity的情况下&#xff0c;使用自定义的primitive来动态绘制圆 3、结合上一篇文章的圆&#xff0c;执行动态圆的更新 二、编写步骤 1、创建绘制线的类 包括构造函数、绘图函数以及销毁函数 import { Viewer, ScreenSpaceEven…

docker-compose启动postgres数据库,实现主从备份

文章目录 1. 主库2. 从库3. 测试 1. 主库 创建pg-m 目录&#xff0c;并进入该目录创建docker-compose.yml文件&#xff0c;内容如下&#xff1a; version: "3.1" services:pg_master:image: postgres:15.3container_name: pg_masterenvironment:POSTGRES_PASSWORD:…

Domain Adaptation Vs. Prompt-Tuning:能否用域自适应解决大模型提示学习问题?

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 作者简介 李江梦&#xff0c;中国科学院软件研究所天基综合信息系统全国重点实验室助理研究员 论文简介 今天介绍的是被机器学习领域顶级学术会议ICLR 2024接收的论文&#xff1a;BayesPrompt: Prompting Large…

广东Lenovo SR588服务器维修升级硬盘内存

本案例描述了对联想SR588服务器进行硬件升级的过程&#xff0c;包括更换固态硬盘作为系统盘&#xff0c;以及增加内存容量至128GB。升级后&#xff0c;服务器性能得到显著提升&#xff0c;同时通过重新配置RAID阵列和操作系统的重新安装&#xff0c;确保了系统的稳定性和数据的…

STM32 NAND FLASH知识点

1.NAND FLASH的简介 NAND FLASH 的概念是由东芝公司在 1989 年率先提出&#xff0c;它内部采用非线性宏单元模式&#xff0c;为固态大容量内存的实现提供了廉价有效的解决方案。 NAND FLASH 存储器具有容量较大&#xff0c;改写速度快等优点&#xff0c;适用于大量数据的存储&…

如何利用Flutter来写后端 服务端应用

前言 Flutter是谷歌推出的一款跨平台开发框架&#xff0c;现在属于此领域star最多的框架&#xff0c;其被广泛应用于构建前台界面&#xff0c;但或许很少人知道&#xff0c;他也可以写后端应用。 本文主角 flutter非常著名的getx库推出的get server jonataslaw/get_server:…

实验01-STP+链路聚合+VRRP实验

1.实验拓扑 2 实验需求 根据拓扑图配置IP地址。交换机之间通过STP防环为了防止SW2-SW3之间聚合的高效链路被STP 阻塞&#xff0c;请配置SW2 为网络中的主根&#xff0c;SW3为网络中的备份根桥。通过VRRP实现网关冗余&#xff0c;网关在SW2和SW3上&#xff0c;其中VLAN10的网关…

【3GPP】【核心网】【5G】5G核心网协议解析(一)(超详细)

1. 5G核心网概念 5G核心网是支撑5G移动通信系统的关键组成部分&#xff0c;是实现5G移动通信的重要基础设施&#xff0c;它负责管理和控制移动网络中的各种功能和服务。它提供了丰富的功能和服务&#xff0c;支持高速、低时延、高可靠性的通信体验&#xff0c;并为不同行业和应…

前端监控为什么采用GIF图片做埋点?

一、什么是埋点监控 前端监控是开发人员用来跟踪和维护应用程序表现层的运行状况的过程和工具。它主要包括三种类型&#xff1a;数据监控、性能监控和异常监控。 1、数据监控 主要是为了收集跟用户相关的数据&#xff0c;例如用户设备类型、浏览器版本、页面浏览量&#xff08;…

GIS之深度学习05:VisualStudio安装教程

在安装CUDA前&#xff0c;建议先安装VisualStudio&#xff0c;以防报错 VisualStudio安装步骤简单&#xff0c;但时间较长。。。。。。 正文开始&#xff1a; VisualStudio官网&#xff1a;Visual Studio: IDE and Code Editor for Software Developers and Teams 点击右上角…

XUbuntu22.04之解决:仓库xxx没有数字签名问题(二百一十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Gitlab: PHP项目CI/CD实践

目录 1 说明 2 CI/CD 2.1 部署方式一&#xff1a;增量部署 2.1.1 目标服务器准备 2.2.2 Gitlab及Envoy脚本 2.2 部署方式二&#xff1a;镜像构建与部署 2.2.1 推送到私有化容器仓库 准备工作 脚本 要点 2.2.2 推送到hub.docker.com 准备工作 脚本 3 参考&#x…

1905_ARMv7-M的堆栈寄存器

1905_ARMv7-M的堆栈寄存器 全部学习汇总&#xff1a; g_arm_cores: ARM内核的学习笔记 (gitee.com) ARMv7-M实现了2种堆栈&#xff0c;分别是MSP和PSP。复位的时候默认是MSP&#xff0c;而当前是哪种可以通过CONTROL.SPSEL寄存器的bit来查看。 SP寄存器的最低2bit&#xff0c;S…

⭐每天一道leetcode:27.移除元素(简单;vector)

⭐今日份题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中…

大模型基础应用框架(ReACT\SFT\RAG)创新及零售业务落地

如何将大语言模型的强大能力融入实际业务、产生业务价值&#xff0c;是现在很多公司关注的焦点。在零售场&#xff0c;大模型应用也面临很多挑战。本文分享了京东零售技数中心推出融合Agent、SFT与RAG的大模型基础应用框架&#xff0c;帮助业务完成大模型微调、部署和应用&…