大一计算机的自学总结:前缀和

前言

作为一种基础算法,前缀和以及构建前缀信息的思想是非常非常重要的。

一、内容

前缀和的内容很简单,就是求数组从0到i-1位置上数值的累加和。经常被用来解决子数组的相关问题,还会在一些更复杂的问题上用来维护前缀信息。

二、相关题目

1.区域和检索 - 数组不可变

class NumArray {
public:vector<int>sum;NumArray(vector<int>& nums) {sum.resize(nums.size()+1);for(int i=1;i<=nums.size();i++){sum[i]=sum[i-1]+nums[i-1];//构建前缀和数组}}int sumRange(int left, int right) {return sum[right+1]-sum[left];}
};

这个题就是最基础的前缀和,即构建前缀和数组。

要求某区间子数组的累加和,只需让right+1位置的前缀和减去left位置的前缀和即可。

2.未排序数组中累加和为给定值的最长子数组长度

#include <bits/stdc++.h>
using namespace std;int main()
{int n,k;cin>>n>>k;vector<int>nums(n);map<int,int>mp;//构建前缀和最早出现位置mp[0]=-1;//初始化int ans=0;for(int i=0,sum=0;i<n;i++){cin>>nums[i];sum+=nums[i];map<int,int>::iterator iter=mp.find(sum-k);if(iter!=mp.end()){ans=max(ans,i-mp[sum-k]);}iter=mp.find(sum);if(iter==mp.end()){mp[sum]=i;}}cout<<ans;
}

这个题就是很经典的构建前缀和最早出现位置,用于解决最长子数组问题。

思路和上题类似,若目标值为k,0~i位置累加和为sum,则只需找累加和为sum-k最早出现的位置即可。

注意,初始化前缀和为0时数组下标为-1,这很重要!!!

3.和为 K 的子数组

class Solution {
public:int subarraySum(vector<int>& nums, int k) {int ans=0;map<int,int>cnt;//记录前缀和出现次数cnt[0]=1;for(int i=0,sum=0;i<nums.size();i++){sum+=nums[i];map<int,int>::iterator iter=cnt.find(sum-k);if(iter!=cnt.end()){ans+=cnt[sum-k];}cnt[sum]++;}return ans;}
};

这个题需要构建前缀和的出现次数,剩下的思路和前两题类似,每次让ans加上出现次数即可。

4.未排序数组中累加和为给定值的最长子数组系列问题补1

#include <bits/stdc++.h>
using namespace std;int main()
{int n;cin>>n;vector<int>nums(n,0);//与数值无关,只关心正负的个数 -> 找前缀和为0for(int i=0,num;i<n;i++){cin>>num;if(num>0){nums[i]=1;}else if(num<0){nums[i]=-1;}}map<int,int>len;len[0]=-1;int ans=0;for(int i=0,sum=0;i<n;i++){sum+=nums[i];map<int,int>::iterator iter=len.find(sum);if(iter!=len.end()){ans=max(ans,i-len[sum]);}else{len[sum]=i;}}cout<<ans;
}

这个题就需要转化一下了。

因为只和正负数的数量有关,和数值大小无关,所以考虑将正数设为1,负数设为-1,这样当前缀和为0时,正负数的数量相同

5.表现良好的最长时间段

class Solution {
public:int longestWPI(vector<int>& hours) {vector<int>nums(hours.size());for(int i=0;i<hours.size();i++){nums[i]=hours[i]>8?1:-1;}int ans=0;map<int,int>len;len[0]=-1;for(int i=0,sum=0;i<nums.size();i++){sum+=nums[i];if(sum>0){ans=max(ans,i+1);}else{map<int,int>::iterator iter=len.find(sum-1);if(iter!=len.end()){ans=max(ans,i-len[sum-1]);}iter=len.find(sum);if(iter==len.end()){len[sum]=i;}}}return ans;}
};

这个题的转化思路和上个题一样,同样是只关心是否大于八小时,所以转化成1和-1。

之后若sum大于0,说明此时大于八小时天数多,就直接结算;否则,需要找累加和大于0的子数组,即之前累加和小于sum的最早位置,而对于需要找的这个累加和,就需要一点思考了。

先观察数组里数的特征,发现只有1和-1两个数且初始的sum等于0。假如此时的sum=-4,说明肯定是从0一直减到-4的,所以,只需要去找累加和-4-1=-5最早出现的位置即可。不找更小的数的原因是,假如找-6,因为sum是从0一直减到-6的,所以-6之前必定出现过一次-5,使得子数组可以变得更长。由此一直递推,可以得出,只需要找sum-1最早出现的位置即可。

最后的这个思路还挺不好想的说实话……

6.使数组和能被 P 整除

class Solution {
public:int minSubarray(vector<int>& nums, int p) {//求整体余数int r=0;for(int i=0;i<nums.size();i++){r=(r+nums[i])%p;//加法同余}//使删除部分余数=整体余数int ans=INT_MAX;map<int,int>late;late[0]=-1;for(int i=0,sum=0,need;i<nums.size();i++){sum=(sum+nums[i])%p;late[sum]=i;//先加入need=(sum-r+p)%p;//减法同余map<int,int>::iterator iter=late.find(need);if(iter!=late.end()){ans=min(ans,i-late[need]);}}return ans==nums.size()?-1:ans;//注意特判}
};

 这个题需要构建前缀和余数。

整体思路是,先求出数组整体的余数。根据减法的同余原理,若要求删除后余数为0,则要删除累加和余数也为整体余数的子数组。而当0~i位置累加和余数为sum时,需要找sum减去整体余数的最晚出现位置,即删除长度最短。

7.每个元音包含偶数次的最长子字符串

class Solution {
public:int findTheLongestSubstring(string s) {int ans=0;vector<int>map(32,-2);map[0]=-1;for(int i=0,n,status=0;i<s.length();i++){n=num(s[i]);if(n!=-1)//元音{status^=(1<<n);}if(map[status]!=-2)//没出现过{ans=max(ans,i-map[status]);} else{map[status]=i;}}return ans;}int num(char c){if(c=='a'){return 0;}else if(c=='e'){return 1;}else if(c=='i'){return 2;}else if(c=='o'){return 3;}else if(c=='u'){return 4;}return -1;}
};

 这个题就需要构建前缀和奇偶状态。

整体思路是,若某几个元音字母数量为奇数,只需要找元音字母状态与此时相同的最早出现位置即可,因为奇+奇=偶,偶+偶=偶。

再进行思考,可以将五个元音字母的状态用位信息来表示,0为偶数,1为奇数。

再观察发现,这样一共只有2^5=32中状态,所以准备长度为32的数组即可。

总结

前缀和算法的使用非常灵活,重点还是对题目的分析和转化,才能构建出前缀信息。

END

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

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

相关文章

MySQL修改JSON格式数据示例

最近发现有个数据是用JSON格式直接存到表格里面的&#xff0c;大概就是下面这样的 然后需要修改里面某个属性的值&#xff0c;一开始我想的是 REPLACE 替换 UPDATE test_1 SET content REPLACE(content, {"age": 15, "name": "w5"}, {"ag…

第4章 信息系统架构(二)

4.2 系统架构 信息系统架构是一种体系结构&#xff0c;它反映了一个组织信息系统的各个组成部分之间的关系&#xff0c;以及信息系统与相关业务、信息系统与相关技术之间的关系。 4.2.1 架构定义 对于大规模的复杂系统来说&#xff0c;对总体的系统结构设计比起对计算算法和…

AI 时代:探索大语言模型与核心技术

引言 在当今科技快速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;正成为推动创新和变革的重要力量。从能够理解和生成自然语言的大语言模型&#xff08;LLM&#xff09;&#xff0c;到具有自我学习能力的生成式预训练转换器&#xff08;GPT&#xff09;&#xf…

Python----数据结构(单链表:节点,是否为空,长度,遍历,添加,删除,查找)

一、链表 链表是一种线性数据结构&#xff0c;由一系列按特定顺序排列的节点组成&#xff0c;这些节点通过指针相互连接。每个节点包含两部分&#xff1a;元素和指向下一个节点的指针。其中&#xff0c;最简单的形式是单向链表&#xff0c;每个节点含有一个信息域和一个指针域&…

10、k8s对外服务之ingress

service和ingress的作用 service的作用 NodePort&#xff1a;会在每个节点开放一个端口&#xff0c;端口号30000-32767。 也是只能用于内网访问&#xff0c;四层转发。实现负载均衡。不能基于域名进行访问。 clusterip&#xff1a;service的默认类型&#xff0c;只能在集群…

Linux-ubuntu系统移植之Uboot启动流程

Linux-ubuntu系统移植之Uboot启动流程 一&#xff0c;Uboot启动流程1.Uboot的两阶段1.1.第一阶段1.11.硬件初始化1.12.复制 U-Boot 到 RAM1.13.跳转到第二阶段 1.2.第二阶段1.21.C 语言环境初始化1.22. 硬件设备初始化1.23. 加载环境变量1.24. 显示启动信息1.25. 等待用户输入&…

H3C交换机路由器防火墙FTP/TFTP服务器搭建。

软件介绍。 3CDaemon 2.0 - Download 3CDaemon 是一款集成了多种网络服务功能的工具软件&#xff0c;主要用于网络管理和文件传输&#xff0c;支持TFTP、FTP、Syslog等多种协议&#xff0c;广泛应用于网络设备的配置和管理。 1. 主要功能 TFTP服务器&#xff1a;支持TFTP协议…

Docker Mysql 数据迁移

查看启动命令目录映射 查看容器名称 docker ps查看容器的启动命令 docker inspect mysql8.0 |grep CreateCommand -A 20如下图所示:我这边是把/var/lib/mysql 目录映射到我宿主机的/mnt/mysql/data目录下,而且我的数量比较大使用方法1的话时间比较久,所以我采用方法2 如果没…

[Windows] WPS 2024冬季更新版(版本号19770)

[Windows] WPS 2024冬季更新版 链接&#xff1a;https://pan.xunlei.com/s/VOJQrS4UCz5639Oan7pu1X84A1?pwdg8ad# WPS灵犀正式上线DeepSeek R1&#xff01;告别服务器超时&#xff0c;办公效率飙升300%&#xff01; 2025年2月14日&#xff0c;WPS官方宣布全面接入DeepSeek …

图解循环神经网络(RNN)

目录 1.循环神经网络介绍 2.网络结构 3.结构分类 4.模型工作原理 5.模型工作示例 6.总结 1.循环神经网络介绍 RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09;是一种专门用于处理序列数据的神经网络结构。与传统的神经网络不同&#xff0c…

【队列】循环队列(Circular Queue)详解

文章目录 一、循环队列简介二、循环队列的判空和判满三、循环队列的实现leetcode 622. 设计循环队列 一、循环队列简介 在实际开发中&#xff0c;队列是一种常用的数据结构&#xff0c;而循环队列&#xff08;Circular Queue&#xff09;则一般是一种基于数组实现的队列&#x…

vmware虚拟机Ubuntu Desktop系统怎么和我的电脑相互复制文件、内容

1、先安装vmware workstation 17 player&#xff0c;然后再安装Ubuntu Desktop虚拟机&#xff0c;然后再安装vmware tools&#xff0c;具体可以参考如下视频&#xff1a; VMware虚拟机与主机实现文件共享&#xff0c;其实一点也不难_哔哩哔哩_bilibili 2、本人亲自试过了&…

Netty入门详解

引言 Netty 是一个基于 Java 的高性能、异步事件驱动的网络应用框架&#xff0c;用于快速开发可维护的高性能网络服务器和客户端。它提供了一组丰富的 API&#xff0c;使得开发人员能够轻松地处理各种网络协议&#xff0c;如 TCP、UDP 等&#xff0c;并且支持多种编解码方式&a…

DeepSeek 助力 Vue 开发:打造丝滑的点击动画(Click Animations)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

Spring-GPT智谱清言AI项目(附源码)

一、项目介绍 本项目是Spring AI第三方调用整合智谱请言&#xff08;官网是&#xff1a;https://open.bigmodel.cn&#xff09;的案例&#xff0c;回答响应流式输出显示&#xff0c;这里使用的是免费模型&#xff0c;需要其他模型可以去 https://www.bigmodel.cn/pricing 切换…

DeepSeek智能测试知识库助手PRO版:多格式支持+性能优化

前言 测试工程师在管理测试资产时,需要面对多种文档格式、大量文件分类及知识库的构建任务。为了解决这些问题,我们升级了 DeepSeek智能测试知识库助手,不仅支持更多文档格式,还加入了 多线程并发处理 和 可扩展格式支持,大幅提升处理性能和灵活性。 主要功能亮点: 多格…

【Python游戏】双人简单对战游戏

以下是一个使用 Python 的 pygame 库实现的简单对战游戏示例&#xff0c;游戏中玩家可以控制两个角色进行对战&#xff0c;并且支持自定义图片(最好使用无底色的png图片)。完整源码以及实现思路&#xff1a; import pygame import os# 初始化 Pygame pygame.init()# 设置游戏窗…

邮件安全之发件人伪造

电子邮件工作原理 电子邮件传输过程中主要涉及到SMTP、IMAP、POP3三种协议&#xff0c;具体功能如下&#xff1a; SMTP:全称Simple Mail Transfer Protocol&#xff0c;即简单邮件传输协议&#xff0c;主要用于发送邮件&#xff0c;使用端口号25。 IMAP:全称Internet Mail Acce…

Ubuntu虚拟机NDK编译ffmpeg

目录 一、ffmpeg源码下载1、安装git(用于下载ffmpeg源码)2、创建源码目录&#xff0c;下载ffmpeg源码 二、下载ubuntu对应的NDK&#xff0c;并解压到opt下1、下载并解压2、配置 ~/.bashrc 三、源码编译、1、创建编译脚本2、脚本文件内容3、设置可执行权限并运行4、编译的结果在…

[展示]Webrtc NoiseSuppressor降噪模块嵌入式平台移植

最近在尝试把WebRtc的NoiseSuppressor模块移植到嵌入式平台&#xff0c;现在已经移植了&#xff0c;尝试了下效果&#xff0c;降噪效果很显著&#xff0c;噪声带被显著抑制了 降噪前&#xff1a; 降噪后&#xff1a;