leetcode算法之前缀和

目录

  • 1.DP34[模板]一维前缀和
  • 2.DP35[模板]二维前缀和
  • 3.寻找数组的中心下标
  • 4.除自身以外数组的乘积
  • 5.和为K的子数组
  • 6.和可被K整除的子数组
  • 7.连续数组
  • 8.矩阵区域和

1.DP34[模板]一维前缀和

一维前缀和
在这里插入图片描述

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int n,q;
    cin>>n>>q;
    vector<long long> v(n+1);
    for(int i=1;i<=n;i++)
    {
        cin>>v[i];
    }
    //1.维护一个前缀和数组
    vector<long long> dp(n+1);
    for(int i=1;i<=n;i++)
    {
        dp[i]=dp[i-1]+v[i];
    }
    //2.使用前缀和数组
    int l,r;
    while(q--)
    {
        cin>>l>>r;
        cout<<dp[r]-dp[l-1]<<endl;
    }
    return 0;
}

2.DP35[模板]二维前缀和

二维前缀和
在这里插入图片描述

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int n,m,q;
    cin>>n>>m>>q;
    vector<vector<long long>>arr(n+1,vector<long long>(m+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));
    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];
        }
    }
    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;
}

3.寻找数组的中心下标

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

class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        int n = nums.size();
        //1.维护一个前缀和和后缀和数组
        vector<int> f(n);
        for(int i=1;i<n;i++)
        {
            f[i] = f[i-1]+nums[i-1];
        }
        vector<int> g(n);
        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;
    }
};

4.除自身以外数组的乘积

除自身以外数组的乘积
在这里插入图片描述

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n = nums.size();
        vector<int> f(n);
        f[0] = 1;
        for(int i=1;i<n;i++)
        {
            f[i] = f[i-1]*nums[i-1];
        }
        vector<int> g(n);
        g[n-1] = 1;
        for(int i = n-2;i>=0;i--)
        {
            g[i] = g[i+1]*nums[i+1];
        }
        vector<int> ret(n);
        for(int i=0;i<n;i++)
        {
            ret[i] = f[i]*g[i];
        }
        return ret;
    }
};

5.和为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 x:nums)
        {
            sum+=x;
            if(hash.count(sum-k)) ret+=hash[sum-k];
            hash[sum]++;
        }
        return ret;
    }
};

6.和可被K整除的子数组

和可被K整除的子数组
在这里插入图片描述

class Solution {
public:
    int subarraysDivByK(vector<int>& nums, int k) {
        //前缀和+哈希表
        unordered_map<int,int> hash;
        hash[0%k] = 1;

        int ret = 0,sum = 0;
        for(auto x:nums)
        {
            sum+=x;
            int r = (sum%k+k)%k;
            if(hash.count(r)) ret+=hash[r];
            hash[r]++;
        }
        return ret;
    }
};


7.连续数组

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

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;
            if(hash.count(sum)) ret = max(ret,i-hash[sum]);
            else hash[sum] = i;
        }

        return ret;
    }
};

8.矩阵区域和

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

class Solution {
public:
    vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {
        int m = mat.size(),n = mat[0].size();
        //二维前缀和+dp数组
        vector<vector<int>> dp(m+1,vector<int>(n+1));
        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]+mat[i-1][j-1]-dp[i-1][j-1];
            }
        }
        //使用前缀和数组dp
        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(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/156178.html

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

相关文章

我对需求分析的理解

一、背景 最近做了一个项目&#xff0c;也算是踩坑过程&#xff0c;产品上线了&#xff0c;用户不怎么买单&#xff0c;使用者聊聊无几&#xff0c;前期一直不清楚为什么会这样&#xff0c;诚然新系统的开发设计上采用了更新的技术&#xff0c;设计上采用了更好的理念&#xf…

计算两个图形遮盖率

读取图像 首先&#xff0c;加载待处理的图像&#xff0c;可以使用图像处理库&#xff08;例如OpenCV&#xff09;来实现这一步。确保已加载正确的图像。 定义特定颜色范围 确定所需的特定颜色范围。这将是要检测的马赛克填充的颜色。需要指定颜色的下限值和上限值&#xff0c;通…

单片机语音芯片在工业控制中的应用优势

单片机语音芯片&#xff0c;这一智能化的代表产品&#xff0c;不仅在家庭和消费电子领域发挥着重要的作用&#xff0c;更为工业控制领域注入了新的活力。将单片机语音芯片与语音交互技术相结合&#xff0c;为工业设备的控制和监测提供了前所未有的解决方案。 首先&#xff0c;…

宏集干货 | 手把手教你通过CODESYS V3进行PLC编程(三)

来源&#xff1a;宏集科技 工业物联网 宏集干货 | 手把手教你通过CODESYS V3进行PLC编程&#xff08;三&#xff09; 教程背景 通过之前的教程&#xff0c;我们已经为大家演示了宏集MC-Prime控制器的连接、试运行和CODESYS的安装&#xff0c;并创建了一个计数器项目。在本期教…

法与智融合,拓世科技集团子公司教授加拓世团队培训大会圆满成功

2023年11月15日&#xff0c;拓世科技集团子公司北京教授加拓世团队抵达拓世集团总部&#xff0c;展开为期两天的参观学习活动&#xff0c;旨在深度挖掘人工智能技术在法律领域的潜力&#xff0c;为法学研究、法律服务行业快速实践数字化提供更加智能高效的支持。 拓世科技集团…

用护眼灯到底好不好?适合小学生用的五款护眼台灯推荐

如果不想家里的孩子年纪小小的就戴着眼镜&#xff0c;从小就容易近视&#xff0c;那么护眼灯的选择就非常重要了&#xff0c;但是市场上那么多品类&#xff0c;价格也参差不齐&#xff0c;到底怎么选呢&#xff1f;大家一定要看完本期内容。为大家推荐五款护眼台灯。 一、书客护…

适用于 Mac 的 10 款最佳数据恢复工具

对于依赖计算机处理重要文件&#xff08;无论是个人照片还是重要业务文档&#xff09;的任何人来说&#xff0c;数据丢失都可能是一场噩梦。 值得庆幸的是&#xff0c;有多种数据恢复工具专门用于Mac用户&#xff0c;可以帮助您恢复丢失或意外删除的文件。 在本文中&#xff0c…

开源软件 FFmpeg 生成模型使用图片数据集

本篇文章聊聊&#xff0c;成就了无数视频软件公司、无数在线视频网站、无数 CDN 云服务厂商的开源软件 ffmpeg。 分享下如何使用它将各种视频或电影文件&#xff0c;转换成上万张图片数据集、壁纸集合&#xff0c;来让下一篇文章中的模型程序“有米下锅”&#xff0c;这个方法…

2023最新最全【Python3.11.3】下载安装零基础教程【附安装包】

前言&#xff1a;链接在最底下 Python是一种可在多个平台上运行的计算机程序设计语言&#xff0c;它是一种高层次的脚本语言&#xff0c;结合了解释性、编译性、互动性和面向对象的特点。最初&#xff0c;它的设计目的是用于编写自动化脚本(shell)。但随着版本的更新和新功能的…

STM32H743 RTC精密数字校准 深度剖析

一、问题 项目中数据报文收到的RTC时间总是会慢一些,经过实际几天的测试得出结论:24小时要慢5S左右。根据手册我了解到可以有误差但不会差这么多,所以进行了如下分析并解决问题。 二、分析 1.影响RTC准确性的因素罗列 硬件基础误差(也就是待校准部分) …

JAVAEE初阶 操作系统

操作系统的相关知识 一.操作系统的定位二.操作系统的作用三.什么是进程/任务1.进程在系统中如何操作和管理 四.PCB中的核心属性1.pid2.内存指针3.文件描述符表 五.CPU1.cpu的特性:分时复发 六.PCB中进行调度的属性1.状态2.优先级3.记账信息 一.操作系统的定位 二.操作系统的作用…

开源 | 携程 Redis On Rocks 实践,节省 2/3 Redis成本

作者简介 patpatbear&#xff0c;携程软件技术专家&#xff0c;负责携程缓存内核的维护&#xff0c;热爱开源&#xff0c;专注于高性能、分布式NoSQL系统的建设和应用。 一、背景 redis使用内存作为存储介质&#xff0c;具有良好的性能和低延迟&#xff0c;但其内存容量通常成为…

聊聊ThreadLocal(一)

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 话说《中华英雄》有一个…

【网络】TCP协议的相关实验

TCP协议的相关实验 一、理解listen的第二个参数1、实验现象2、TCP 半连接队列和全连接队列3、关于listen的第二个参数的一些问题4、SYN洪水Ⅰ、什么是SYN洪水攻击Ⅱ、如何解决SYN洪水攻击&#xff1f; 二、使用Wireshark分析TCP通信流程 一、理解listen的第二个参数 在编写TCP…

java“俄罗斯方块”

首先新建议一个包为Tetris &#xff08;俄罗斯方块&#xff09; 类名也叫做Tetris&#xff1b; 代码运行&#xff1a; package Tetris; import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.awt.event.KeyEvent; import java.aw…

Rust图形界面:eGUI的Panel布局

文章目录 Panel布局尺寸调节源码 Panel布局 eGUI提供面板堆叠的布局方案&#xff0c;即Panel布局。其布局逻辑是&#xff0c;根据当前面板指定的方向&#xff0c;尽可能地填充空间。 CentralPanel 占据屏幕剩余部分的空间SidePanel 占据屏幕两侧的空间&#xff0c;在具体调用…

听GPT 讲Rust源代码--library/core/src(5)

题目来自 Understanding Box in Rust &#x1f980; File: rust/library/core/src/num/saturating.rs 在Rust的核心库中&#xff0c;源代码路径rust/library/core/src/num/saturating.rs所对应的文件是用来实现饱和运算的功能。 饱和运算是一种数值运算的方式&#xff0c;用于处…

中级程序员——uniapp和小程序面试题

&#x1f604;博主&#xff1a;小猫娃来啦 &#x1f604;文章核心&#xff1a;uniapp和小程序面试题 文章目录 用uniapp有遇到一些兼容性问题吗&#xff1f;uniapp最大的优点是什么&#xff1f;uniapp如何实现多端兼容&#xff1f;uniapp是如何做跨端适配的&#xff1f;常用的u…

1~2亿条数据需要缓存之安装redis集群(哈希取余分区、一致性哈希算法分区、哈希槽分区)

安装redis集群 面试题 1~2亿条数据需要缓存&#xff0c;请问如何设计这个存储案例??? 回答: 单机单台100%不可能&#xff0c;肯定是分布式存储&#xff0c;用redis如何落地&#xff1f; 上述问题阿里P6~P7工程案例和场景设计类必考题目&#xff0c; 一般业界有3种解决方案 …