【优选算法】---前缀和

前缀和

  • 一、【模板】一维前缀和
  • 二、【模板】二维前缀和
  • 三、寻找数组的中心下标
  • 四、除自身以外数组的乘积
  • 五、和为K子数组
  • 六、和可被 K 整除的子数组
  • 七、连续数组
  • 八、矩阵区域和

一、【模板】一维前缀和

一维前缀和,链接

在这里插入图片描述

1、预处理出来一个前缀和数组

注意:一般处理前缀和数组的时候 下标要从1开始!
在这里插入图片描述

2、使用该前缀和数组
在这里插入图片描述

#include <iostream>
using namespace std;

#include<vector>
int main() 
{
    int n,q;
    cin>>n>>q;

    vector<int> arr(n+1);
    // 1、读入数据
    for(int i=1;i<=n;i++)  cin>>arr[i];

    // 2、预处理一个前缀和数组
    vector<long long> dp(n+1);

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

    // 3、使用前缀和数组
    int l,r;
    while(q--)
    {
        cin>>l>>r;
        cout<<dp[r]-dp[l-1]<<endl;
    }
    return 0;
}

在这里插入图片描述

二、【模板】二维前缀和

二维前缀和、链接

在这里插入图片描述

1、预处理出来一个前缀和数组

注意:一般处理前缀和数组的时候 下标要从1开始!
在这里插入图片描述
在这里插入图片描述

2、使用该前缀和数组
在这里插入图片描述

#include <iostream>
using namespace std;
#include<vector>
int main() 
{   int n,m,q;
    cin>>n>>m>>q;
    vector<vector<int>> arr(n+1,vector<int>(m+1));

    // 1、读入数据
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>arr[i][j];
        }
    }

    vector<vector<long long>> dp(n+1,vector<long long>(m+1));
    
	// 2、预处理出来一个前缀和数组
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            dp[i][j]=dp[i-1][j]+dp[i][j-1]+arr[i][j]-dp[i-1][j-1];
        }
    }


    // 3、使用前缀和数组

    int x1,y1,x2,y2;
    
    while(q--)
    {
        cin>>x1>>y1>>x2>>y2;
        cout<<dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1]<<endl;
    }
    return 0;
}

三、寻找数组的中心下标

在这里插入图片描述
寻找数组的中心下标、链接
在这里插入图片描述

class Solution 
{
public:
    int pivotIndex(vector<int>& nums)
    {
        // 1、预处理前缀和、后缀和
        int n=nums.size();
        vector<int> f(n),g(n);

        for(int i=1;i<n;i++)
        // 对f[0]、g[n-1]已经进行了特殊处理,所以两次处理都要从第二个数据开始!
            f[i]=f[i-1]+nums[i-1];
        for(int i=n-2;i>=0;i--)
            g[i]=g[i+1]+nums[i+1];

        // 2、使用前后缀和
        for(int i=0;i<n;i++)
            if(f[i]==g[i])
                return i;
        return -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;

        // 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);
        // 2、使用预处理的数组
        for(int i=0;i<n;i++)
        {
            ans[i]=f[i]*g[i];
        }
        return ans;
    }
};

五、和为K子数组

在这里插入图片描述

和为 K 的子数组、链接

在这里插入图片描述
在这里插入图片描述

class Solution 
{
public:
    int subarraySum(vector<int>& nums, int k) 
    {
        unordered_map<int,int> hash;
        hash[0]=1;

        int sum=0,ret=0;
        for(auto e:nums)
        {
            sum+=e;// sum:当前位置的前缀和
            if(hash.count(sum-k)) ret+=hash[sum-k];
            // 如果在哈希表里面找到sum-k的前缀和,说明在sum这个区间上有一个和为k的子数组!
            hash[sum]++;
        }
        return ret;
    }
};

六、和可被 K 整除的子数组

在这里插入图片描述

和可以被k整除的子数组、链接

1、补充的知识!
在这里插入图片描述
2、算法原理:
在这里插入图片描述

class Solution 
{
public:
    int subarraysDivByK(vector<int>& nums, int k) 
    {
        unordered_map<int,int> hash;
        hash[0%k]=1;//存的是0%k的余数

        int sum=0,ret=0;
        for(auto e:nums)
        {
            sum+=e;

            int r=(sum%k+k)%k;// 注意:修正后的余数

            if(hash.count(r))  ret+=hash[r];//我们找的是前缀和中的余数
            hash[r]++;// 把当前位置的余数加入哈希表!
        }
        return ret;
    }
};

七、连续数组

在这里插入图片描述
连续数组、链接

在这里插入图片描述

class Solution 
{
public:
    int findMaxLength(vector<int>& nums) 
    {
        unordered_map<int,int> hash;

        hash[0]=-1;

        int sum=0,ret=0;
        for(int i=0;i<nums.size();i++)
        {
            sum+=nums[i]==0?-1:1;// 1、将 数组中的0全部转化为-1,当前位置的前缀和
            // 2、我们是 用完之后 把sum加入hash里面
            if(hash.count(sum))  ret=max(ret,i-hash[sum]);// 如果在0~i-1区间找到了sum就更新ret
            else hash[sum]=i; // 如果在hash里面,存在重复的<sum,i> 只保留前面的哪一个
        }
        return ret;
    }
};

八、矩阵区域和

在这里插入图片描述
矩阵区域和、链接

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Solution 
{
public:
    vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) 
    {
        int m=mat.size(),n=mat[0].size();// m行,n列


        // 1、预处理一个前缀和矩阵
        vector<vector<int>> dp(m+1,vector<int> (n+1));// dp是我们的递推矩阵
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {
                dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+mat[i-1][j-1];
                // 在dp里面用mat的话,i,j都要-1,因为dp开空间的时候就已经多开了一行一列!

            }
        }

        // 2、使用
        vector<vector<int>> ret(m,vector<int> (n));
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                // 最左上角,不能小于(0,0)。最右下角不能超出(m-1,n-1)
                int x1=max(0,i-k)+1,y1=max(0,j-k)+1;
                int x2=min(m-1,i+k)+1,y2=min(n-1,j+k)+1;

                ret[i][j]=dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1];

            }
        }

        return ret;
    }
};

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

消息中间件 --Kafka

一、 Kafka 1.kafka介绍 Kafka 是一个分布式流媒体平台,类似于消息队列或企业消息传递系统。 生产者发送消息&#xff0c;多个消费者只能有一个消费者接收到消息 生产者发送消息&#xff0c;多个消费者都可以接收到消息 producer&#xff1a;发布消息的对象称之为主题生产者…

时序数据库 IoTDB 为什么选择 TPCx-IoT 基准测评?

IoTDB 在 TPCx-IoT 榜单的 What 与 Why 解答&#xff01; 去年&#xff0c;我们发布了 IoTDB 多项性能表现位居国际数据库性能测试排行榜 benchANT&#xff08;Time Series: DevOps&#xff09;第一名的好消息。 刚刚落幕的数据库顶级会议 VLDB 上&#xff0c;我们又收获了一则…

Python QT实现A-star寻路算法

目录 1、界面使用方法 2、注意事项 3、补充说明 用Qt5搭建一个图形化测试寻路算法的测试环境。 1、界面使用方法 设定起点&#xff1a; 鼠标左键双击&#xff0c;设定红色的起点。左键双击设定起点&#xff0c;用红色标记。 设定终点&#xff1a; 鼠标右键双击&#xf…

猴王采集——多多采集必备,关键词,类目整店采集,正在拼爆款截流采集

在日新月异的电商领域&#xff0c;数据就是商战的情报&#xff0c;而精准、高效的数据采集则成为商家们制胜的关键。今天&#xff0c;让我们一同探索一款颠覆传统、引领未来的数据采集工具 一、关键词类目整店采集&#xff1a; “猴王采集”凭借其强大的关键词搜索能力&#…

什么是 TDengine?

TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台&#xff0c;其核心模块是高性能、集群开源、云原生、极简的时序数据库。它能安全高效地将大量设备、数据采集器每天产生的高达 TB 甚至 PB 级的数据进行汇聚、存储、分析和分发&#xff0c;对业务运行状态进…

深入RabbitMQ世界:探索3种队列、4种交换机、7大工作模式及常见概念

文章目录 文章导图RabbitMQ架构及相关概念四大核心概念名词解读 七大工作模式及四大交换机类型0、前置了解-默认交换机DirectExchange1、简单模式(Simple Queue)-默认DirectExchange2、 工作队列模式(Work Queues)-默认DirectExchange3、发布/订阅模式(Publish/Subscribe)-Fano…

探索EasyCVR与AI技术深度融合:视频汇聚平台的新增长点

随着5G、AI、边缘计算、物联网&#xff08;IoT&#xff09;、云计算等技术的快速发展&#xff0c;万物互联已经从概念逐渐转变为现实&#xff0c;AIoT&#xff08;物联网人工智能&#xff09;的新时代正在加速到来。在这一背景下&#xff0c;视频技术作为信息传输和交互的重要手…

简单实用的php全新实物商城系统

免费开源电商系统,提供灵活的扩展特性、高度自动化与智能化、创新的管理模式和强大的自定义模块,让电商用户零成本拥有安全、高效、专业的移动商城。 代码是全新实物商城系统源码版。 代码下载

c++进阶——unordered的封装

嗨喽大家好呀&#xff0c;今天阿鑫给大家带来的是c进阶——unordered的封装&#xff0c;好久不见啦&#xff0c;下面让我们进入本节博客的内容吧&#xff01; c进阶——unordered的封装 unordered系列的基本架构unordered系列迭代器的封装unordered不支持修改keyoperator[]的…

macos系统内置php文件列表 系统自带php卸载方法

在macos系统中, 自带已经安装了php, 根据不同的macos版本php的版本号可能不同, 我们可以通过 which php 命令来查看mac自带的默认php安装路径, 不过注意这个只是php的执行文件路径. 系统自带php文件列表 一下就是macos默认安装的php文件列表. macos 10.15内置PHP文件列表配置…

软件工程-图书管理系统的概要设计

软件概要设计说明书 目录 软件概要设计说明书 一、引言 1.1 编写目的 1.2 背景 1.3 定义 1.3.1特定对象 1.3.2专业术语 1.4 参考资料 二、总体设计 2.1 需求规定 2.1.1信息要求 2.1.2功能要求 2.2 运行环境 2.3 基本概要设计和处理流程 2.4 体系结构设计 2.5 模…

基于微信小程序在线订餐系统

微信小程序在线订餐系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了微信小程序在线订餐系统的开发全过程。通过分析微信小程序在线订餐系统管理的不足&#xff0c;创建了一个计算机管理微信小程序在线订…

【Python基础】Python函数

本文收录于 《Python编程入门》专栏&#xff0c;从零基础开始&#xff0c;分享一些Python编程基础知识&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、函数的定义与调用三、函数参数3.1 位置参数3.2 默认参数3.3 可变数量参数&#xff08;或不定长参数…

Kubernetes 简介及部署方法

目录 一、Kubernetes简介 1 应用部署方式演变 1.2 容器编排应用 1.3 kubernetes 简介 1.4 K8S的设计架构 1.4.1 K8S各个组件用途 1.4.2 K8S 各组件之间的调用关系 1.4.3 K8S 的 常用名词感念 1.4.4 k8S的分层架构 二 K8S集群环境搭建 2.1 k8s中容器的管理方式 2.2 …

网络安全知识:什么是访问控制列表 (ACL)?

访问控制列表 (ACL) 是网络安全和管理的基础。它们在确定谁或什么可以访问网络内的特定资源方面发挥着重要作用。 本文深入探讨了 ACL 的复杂性&#xff0c;探索了其类型、组件、应用程序和最佳实践。我们还将比较不同操作系统的 ACL&#xff0c;并讨论它们在网络架构中的战略…

生信圆桌x生信分析平台:助力生物信息学研究的综合工具

介绍 少走弯路,高效分析;了解生信云,访问 【生信圆桌x生信专用云服务器】 : www.tebteb.cc 生物信息学的迅速发展催生了众多生信分析平台&#xff0c;这些平台通过集成各种生物信息学工具和算法&#xff0c;极大地简化了数据处理和分析流程&#xff0c;使研究人员能够更高效地…

如何使div居中?CSS居中终极指南

前言 长期以来&#xff0c;如何在父元素中居中对齐一个元素&#xff0c;一直是一个让人头疼的问题&#xff0c;随着 CSS 的发展&#xff0c;越来越多的工具可以用来解决这个难题&#xff0c;五花八门的招式一大堆&#xff0c;这篇博客&#xff0c;旨在帮助你理解不同的居中方法…

EVO进行轨迹评估

EVO进行轨迹评估 文章目录 EVO进行轨迹评估1 前言1.1 轨迹对齐1.2 尺度变换1.3 绝对轨迹误差ATE和相对轨迹误差RTE1.4 绝对姿态误差APE和相对姿态误差RPE 2 安装evo2.1 evo安装2.2 相关报错2.2.1 版本不兼容问题2.2.2 解决PATH警告 2.3 测试 3 evo指令3.1 evo_traj3.2 evo_ape3…

Spring Boot3.x 启动自动执行sql脚本

1 引言 某些项目在首次启动时&#xff0c;需要先手动创建数据库表&#xff0c;然后再手动写入初始数据才能正常使用。为了省去这个手动操作过程&#xff0c;我们可以使用Spring Boot启动时执行sql脚本的配置&#xff0c;全自动完成这个过程。 2 配置 具体配置如下&#xff1…

Python 调用手机摄像头

Python 调用手机摄像头 在手机上安装软件 这里以安卓手机作为演示&#xff0c;ISO也是差不多的 软件下载地址 注意&#xff1a;要想在电脑上查看手机摄像头拍摄的内容的在一个局域网里面(没有 WIFI 可以使用 热点 ) 安装完打开IP摄像头服务器 点击分享查看IP 查看局域网的I…