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,一经查实,立即删除!

相关文章

MySQL - #1115 - Unknown character set: ‘utf8mb4‘

问题描述 #1115 - Unknown character set: utf8mb4 原因分析 因为在创建表的时候是有这个编码的&#xff0c;但是在单独修改某个字段的编码时发现报错&#xff0c;虽然觉得莫名其妙&#xff0c;那就将机就计&#xff0c;改成大概率有的编码——UTF8&#xff0c;因为这边为的是…

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设备…

云计算 3月2号 (自配本地和远程yum源)

自建yum源 本地源 一、使用本地的镜像文件来制作yum源(做完记得删除) 1、挂载dvd镜像或将镜像拷贝到机器中 mkdir /yum-repo mount /dev/cdrom /yum-repo # 如果我们在设置中挂载了镜像使用这个方法 mount 镜像的路径 /yum-repo # 如果我们拷贝镜像到了系统中&#xff0c;可…

flink on yarn paimon

目录 概述实践paimon 结束 概述 ogg kafka paimon 实践 前置准备请看如下文章 文章链接hadoop一主三从安装链接spark on yarn链接flink的yarn-session环境链接 paimon 目标: 1.同步表2.能过 kafka 向 paimon写入 SET parallelism.default 2; set table.exec.sink.not-n…

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

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

C++ Date类型定义 (类的简单实践案例)

//头文件#include<iostream> #include<assert.h> using namespace std;class Date { public:// 获取某年某月的天数int GetMonthDay(int year, int month);// 全缺省的构造函数Date(int year 1900, int month 1, int day 1);// 拷贝构造函数// d2(d1)Date(const…

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;适用于大量数据的存储&…

MySQL EXPLAIN 性能分析工具详解

EXPLAIN 是 MySQL 中一个非常重要的性能分析工具&#xff0c;它用于显示 MySQL 如何执行 SQL 查询。通过 EXPLAIN&#xff0c;你可以查看查询的执行计划&#xff0c;从而理解查询是如何被优化和执行的&#xff0c;从而找出可能的性能瓶颈。 如何使用 EXPLAIN 使用 EXPLAIN 非…

CC++语言强制类型转换的类型

介绍 在C语言中&#xff0c;可以使用强制类型转换&#xff08;也称为显式类型转换&#xff09;来改变一个变量的类型。这通常在你需要将一个类型的值转换为不兼容的另一种类型时非常有用。 强制类型转换的语法如下&#xff1a; (type_name) expression其中&#xff0c;type_…

Unix Network Programming Episode 88

‘inetd’ Daemon On a typical Unix system, there could be many servers in existence, just waiting for a client request to arrive. Examples are FTP, Telnet, Rlogin, TFTP, and so on. With systems before 4.3BSD, each of these services had a process associate…

如何利用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;并为不同行业和应…