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];}}//使用前缀和数组dpvector<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;}
};

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

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

相关文章

电压跟随器

电压跟随器即输入多大电压就输出多大的电压&#xff0c;那其起什么作用呢&#xff0c;直接用导线不行吗&#xff1f; 下图为Multisim软件仿真结果&#xff0c;很明显输入电压6.5V输出电压使用万用表测得同为6.5V&#xff0c;验证了电压跟随器的作用。 在同相放大电路的基础上&a…

安装SSL证书有什么意义?

在当今的数字化时代&#xff0c;网络安全已经成为了一个重要的议题。为了保护网站和用户数据的安全&#xff0c;许多网站都选择了安装SSL证书。同时&#xff0c;很多用户不明白安装SSL证书到底有什么意义&#xff1f; 一、网站实现加密传输 用户通过http协议访问网站时&#x…

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

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

【C#】解析和操作HTML文档,并进行同级或跨级匹配元素

给自己一个目标&#xff0c;然后坚持一段时间&#xff0c;总会有收获和感悟&#xff01; 在前端&#xff0c;我们可以通过javascript操作元素&#xff0c;只要知道元素的class或id等属性值&#xff0c;学过jQuery的小伙伴&#xff0c;使用jQuery操作元素对象更加方便。 如果是后…

解决SSH连接自动断开的问题

一、环境 centos7.6 xshell7 二、目标 ssh长联状态&#xff0c;不主动断开 三、实施 1.修改/etc/profile文件 末尾添加export TMOUT0 vim /etc/profileexport TMOUT02.修改/etc/ssh/sshd_config文件 默认都被注释掉&#xff0c;放开并设置CAI参数为0-60间 vim /etc…

基于单片机设计的电子指南针(LSM303DLH模块(三轴磁场 + 三轴加速度)

一、前言 本项目是基于单片机设计的电子指南针&#xff0c;主要利用STC89C52作为主控芯片和LSM303DLH模块作为指南针模块。通过LCD1602液晶显示屏来展示检测到的指南针信息。 在日常生活中&#xff0c;指南针是一种非常实用的工具&#xff0c;可以帮助我们确定方向&#xff0…

vue 城市选择器的使用 element-china-area-data

一、Element UI 中国省市区级联数据 本文参考&#xff1a;element-china-area-data - npm 1. 安装 npm install element-china-area-data -S2. 使用 import { provinceAndCityData, regionData, provinceAndCityDataPlus, regionDataPlus, CodeToText, TextToCode } from e…

vs2017 编译Qt 5.11.2 源码

SDK 10.0.22000.194 有 2种编译方式 &#xff0c;第二种 看下面 推荐使用方式二&#xff0c;简单方便&#xff0c;唯一不好是慢 方式一: 1、问题描述&#xff1a; 使用VS编译程序时&#xff0c;运行库选择多线程&#xff08;/MT&#xff09;&#xff0c;表示采用多线程静态…

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

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

js实现tab栏切换

目录 1、排他思想实现 2、事件委托实现 1、排他思想实现 思路&#xff1a; 需要点击谁&#xff0c;就先获取谁&#xff0c;获得的是一个伪数组 遍历数组&#xff0c;并给数组里的每个元素添加点击事件&#xff0c;写一个active类用于显示边框样式 每一个元素对应一张图片&…

连新手小白都知道的电子画册一键生成器,你还不知道吗?

相信大家平时见得比较多的是纸质画册&#xff0c;而对于电子画册大家又了解多少呢&#xff1f;电子画册近年来倍受众多企业青睐&#xff0c;制作一本好的电子画册能够让企业在市场竞争中脱颖而出&#xff0c;给人以深刻印象。如何制作呢&#xff1f; 其实很简单&#xff0c;关…

电脑集中管理软件|局域网电脑集中管控怎么做

电脑集中管理软件|局域网电脑集中管控怎么做 电脑集中管理软件可以实现对员工工作情况的实时追踪&#xff0c;将工作效率情况采用可视化展示&#xff0c;管理者可根据图表发现员工工作效率低下的主要原因&#xff0c;并适当的调整&#xff0c;充分发挥员工的长处&#xff0c;从…