【算法基础】--前缀和

news2025/2/23 1:28:29

前缀和

  • 一、一维前缀和
    • 示例模板
    • [寻找数组的中心下标 ](https://leetcode.cn/problems/tvdfij/description/)
    • 除自身以外的数组乘积
    • 和可被k整除的子数组

在这里插入图片描述

一、一维前缀和

前缀和就是快速求出数组某一个连续区间内所有元素的和。

示例模板

已知一个数组arr,求前缀和
在这里插入图片描述
第一步,预处理一个前缀和数组dp,dp[i]表示:从[1,i]区间内所有元素和。
在这里插入图片描述
dp[1]=arr[1];
dp[2]=arr[1]+arr[2]=dp[1]+arr[2]
dp[3]=arr[1]+arr[2]+arr[3]=dp[2]+arr[3]

以此类推,可得:dp[i]=dp[i-1]+arr[i]
第二步:使用前缀和数组
假若区间【l,r】内所有元素和。可得dp[r]-dp[l-1].
在这里插入图片描述
相应代码:

for(int i=1;i<=n;i++)
{
	dp[i]=dp[i-1]+arr[i];
}

细节:下表为什么从1开始?假设求【0,3】区间和,那么dp[3]-dp[-1],dp[-1]边界直接越界了.房主边界问题。
上述代码只是个参考,具体问题应具体分析。


例题1:

寻找数组的中心下标

在这里插入图片描述
解析:

还是使用前缀和的思维。使用俩数组分别来记录中心下标左边的和,以及右边的和。 然后遍历整个数组,如果俩数组相等,返回下标i

在这里插入图片描述

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;
    }
};


例题2:

除自身以外的数组乘积

题目描述:
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。请不要使用除法,且在 O(n) 时间复杂度内完成此题。
在这里插入图片描述


解析:这里使用的方法和上一道题解法类似,只不过换了一种说法。题目所说求除i为之外其余元素的积,我们换一种思维就是 前缀积和后缀积的积。假设我们要求i位置的值时,我们可以求出【0,i-1】位置区间所有元素积和【i+1,n-1】区间范围所有元素积。再将他俩相乘即可。草图如下:

在这里插入图片描述

代码:

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

        //使用
        vector<int>ans(n);
        for(int i=0;i<n;i++)
        {
            ans[i]=g[i]*f[i];
        }
        return ans;
    }
};



例3:

和可被k整除的子数组

给定一个整数数组 nums 和一个整数 k ,返回其中元素之和可被 k 整除的非空 子数组 的数目。子数组 是数组中 连续 的部分。
在这里插入图片描述

解析:

这里先讲一下有关知识点:同余定理

在这里插入图片描述

在c++/java中:(负%正)=负,为了让这个余数是正数,给出了这样的方法修正:a%p+p,但是又不能确定a是正数还是负数,为了统一:(a%p+p)%p,以后取模运算,有负数时,用这个方法。

在该题中,求可被k整除的子数组个数,我们用到前缀和+哈希方法。在[0,i-1]区间内找到多少前缀和余数等于(sum%k+k)%k.,余数存进哈希表。定义个哈希表,第一个int代表前缀和的余数,第二个代表个数。

在这里插入图片描述

代码:

class Solution {
public:
    int subarraysDivByK(vector<int>& nums, int k) {
        unordered_map<int,int>hash;//存的是余数
        hash[0%k]=1;//余数
        int sum=0,res=0;
        for(auto x:nums)
        {
            sum+=x;//算出当前位置前缀和
            int y=(sum%k+k)%k;//求余数
            if(hash.count(y))   res+=hash[y];
            hash[y]++;//不要忘记将余数继续扔进哈希表里

        }
        return res;
    }
};

希望读者喜欢
你们的支持是小编动力的源泉

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

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

相关文章

统一的多摄像头3D感知框架!PETRv2论文精读

论文地址&#xff1a;PETRv2: A Unified Framework for 3D Perception from Multi-Camera Images 源代码&#xff1a;PETR 摘要 在本文中&#xff0c;我们提出了PETRv2&#xff0c;用于从多视角图像中进行3D感知的统一框架。基于PETR [24]&#xff0c;PETRv2探索了时间建模的…

【Linux】Linux 文件系统—— 探讨软链接(symbolic link)

ℹ️大家好&#xff0c;我是练小杰&#xff0c;周五又到了&#xff0c;明天应该就是牛马的休息日了吧&#xff01;&#xff01;&#x1f606; 前天我们详细介绍了 硬链接的特点&#xff0c;现在继续探讨 软链接的特点&#xff0c;并且后续将添加更多相关知识噢&#xff0c;谢谢…

Linux-CentOS 7安装

Centos 7镜像&#xff1a;https://pan.baidu.com/s/1fkQHYT64RMFRGLZy1xnSWw 提取码: q2w2 VMware Workstation&#xff1a;https://pan.baidu.com/s/1JnRcDBIIOWGf6FnGY_0LgA 提取码: w2e2 1、打开vmware workstation 2、选择主界面的"创建新的虚拟机"或者点击左上…

AI助力下的PPT革命:DeepSeek 与Kimi的高效创作实践

清华大学出品《DeepSeek&#xff1a;从入门到精通》分享 在忙碌的职场中&#xff0c;制作一份高质量的PPT往往需要投入大量时间和精力&#xff0c;尤其是在临近截止日期时。今天&#xff0c;我们将探索如何借助 AI 工具 —— DeepSeek 和 Kimi —— 让 PPT 制作变得既快捷又高…

【opencv】图像基本操作

一.计算机眼中的图像 1.1 图像读取 cv2.IMREAD_COLOR&#xff1a;彩色图像 cv2.IMREAD_GRAYSCCALE&#xff1a;灰色图像 ①导包 import cv2 # opencv读取的格式是BGR import matplotlib.pyplot as plt import numpy as np %matplotlib inline ②读取图像 img cv2.imread(…

帆软报表FineReport入门:简单报表制作[扩展|左父格|上父格]

FineReport帮助文档 - 全面的报表使用教程和学习资料 数据库连接 点击号>>JDBC 选择要连接的数据库>>填写信息>>点击测试连接 数据库SQLite是帆软的内置数据库, 里面有练习数据 选择此数据库后,点击测试连接即可 数据库查询 方法一: 在左下角的模板数据集…

云手机如何进行经纬度修改

云手机如何进行经纬度修改 云手机修改经纬度的方法因不同服务商和操作方式有所差异&#xff0c;以下是综合多个来源的常用方法及注意事项&#xff1a; 通过ADB命令注入GPS数据&#xff08;适用于技术用户&#xff09; 1.连接云手机 使用ADB工具连接云手机服务器&#xff0c;…

天 锐 蓝盾终端安全管理系统:办公U盘拷贝使用管控限制

天 锐 蓝盾终端安全管理系统以终端安全为基石&#xff0c;深度融合安全、管理与维护三大要素&#xff0c;通过对桌面终端系统的精准把控&#xff0c;助力企业用户构筑起更为安全、稳固且可靠的网络运行环境。它实现了管理的标准化&#xff0c;有效破解终端安全管理难题&#xf…

计算机网络之物理层——基于《计算机网络》谢希仁第八版

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

区块链中的递归长度前缀(RLP)序列化详解

文章目录 1. 什么是RLP序列化&#xff1f;2. RLP的设计目标与优势3. RLP处理的数据类型4. RLP编码规则详解字符串的编码规则列表的编码规则 5. RLP解码原理6. RLP在以太坊中的应用场景7. 编码示例分析8. 总结 1. 什么是RLP序列化&#xff1f; 递归长度前缀&#xff08;RLP&…

分布式简单理解

基本概念 应⽤(Application)/系统&#xff08;System&#xff09; 为了完成⼀整套服务的⼀个程序或者⼀组相互配合的程序群。⽣活例⼦类⽐&#xff1a;为了完成⼀项任 务&#xff0c;⽽搭建的由⼀个⼈或者⼀群相互配的⼈组成的团队。 模块&#xff08;Module&#xff09;/组件…

记录:Docker 安装记录

今天在安装 ollama 时发现无法指定安装目录&#xff0c;而且它的命令行反馈内容很像 docker &#xff0c;而且它下载的模型也是放在 C 盘&#xff0c;那么如果我 C 盘空间不足&#xff0c;就装不了 deepseek-r1:70b &#xff0c;于是想起来之前安装 Docker 的时候也遇到过类似问…

Leetcode 二叉树展开为链表

java solution class Solution {public void flatten(TreeNode root) {//首先设置递归终止条件if(root null) return;//分别递归处理左右子树&#xff0c;//递归需要先处理子问题&#xff08;子树的拉平&#xff09;&#xff0c;然后才能处理当前问题&#xff08;当前节点的指…

RabbitMQ 消息队列 优化发送邮件

express 发送邮件 最简单的异步发送邮件方法为何要使用 RabbitMQ&#xff1f;如何在 Node 项目中集成 RabbitMQ&#xff1f; 一、 不用 await 发送邮件 在实际开发之前&#xff0c;不妨先思考下&#xff0c;我们最终的目的是为了让邮件异步发送。那发送邮件这里有个await&am…

NetLogon 权限提升漏洞

参考文章&#xff1a;CVE-2020-1472NetLogon权限提升漏洞_cve-2020-1472复现 谢公子-CSDN博客 域控机器账户&#xff1a;WIN-0V0GAORDC17 域控 ip&#xff1a;192.168.72.163 域内攻击者机器 ip&#xff1a;192.168.72.158&#xff0c;host&#xff1a;WIN10-01 攻击者 kali…

【C++】 Flow of Control

《C程序设计基础教程》——刘厚泉&#xff0c;李政伟&#xff0c;二零一三年九月版&#xff0c;学习笔记 文章目录 1、选择结构1.1、if 语句1.2、嵌套的 if 语句1.3、条件运算符 ?:1.4、switch 语句 2、循环结构2.1、while 语句2.2、do-while 语句2.3、 for 循环2.4、循环嵌套…

图论 之 迪斯科特拉算法求解最短路径

文章目录 题目743.网络延迟时间3341.到达最后一个房间的最少时间I 求解最短路径的问题&#xff0c;分为使用BFS和使用迪斯科特拉算法&#xff0c;这两种算法求解的范围是有区别的 BFS适合求解&#xff0c;边的权值都是1的图中的最短路径的问题 图论 之 BFS迪斯科特拉算法适合求…

Spring Boot 中事务的用法详解

引言 在 Spring Boot 中&#xff0c;事务管理是一个非常重要的功能&#xff0c;尤其是在涉及数据库操作的业务场景中。Spring 提供了强大的事务管理支持&#xff0c;能够帮助我们简化事务的管理和控制。本文将详细介绍 Spring Boot 中事务的用法&#xff0c;包括事务的基本概…

【react18】如何使用useReducer和useContext来实现一个todoList功能

重点知识点就是使用useReducer来攻坚小型的公共状态管理&#xff0c;useImmerReducer来实现数据的不可变 实现效果 实现代码 项目工程结构 App.js文件 import logo from "./logo.svg"; import "./App.css"; import TodoLists from "./comps/TodoLi…