前缀和_560. 和为 K 的子数组

560. 和为 K 的子数组

#include <unordered_map>
class Solution {
public:int subarraySum(vector<int>& nums, int k) {int n=nums.size();unordered_map<int,int> hs;int sum=0,re=0;hs[0]=1;for(int i=0;i<n;i++){sum+=nums[i];if(hs.count(sum-k)) re+=hs[sum-k];  hs[sum]++;}return re;}
};

 

求和为k的子数组,我们先求以下标i为结尾的子数组和==k的情况,即求前缀和==sum[i]-k的情况有多少种

1.在[0,i-1]区间内,有多少前缀和==sum[i]-k.用unordered_map<int,int>,第一个int记录前缀和,第二个int记录相同前缀和的次数。

2.对于sum[i]==k,即[0,i]整个区间的情况。这种情况前缀和==0,需要特殊处理hs[0]=1

假设我们有一个数组[k,2k,3k]在遍历到第一个元素时,sum正好等于k。如果没有初始化hs[0]=1此时hs[0]不存在于哈希表中,导致算法无法将这段部分和计入结果。

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

这道题和上面题一样,上一道题哈希表存入的是sum-前缀和。

这道题是什么呢?还是要看sum当前位置前缀和 x前缀和 k三者的关系。

求一段连续区间可被K整除,也是先以i为该区间的结尾,求紫区间是否可被K整除,就转化为求在哈希表中当前sum除k相同余数。因为sum可能为负数,不能在哈希表中映射要变为正数。(sum%k+k)/k

class Solution {
public:int subarraysDivByK(vector<int>& nums, int k) {unordered_map<int, int> hash;hash[0 % k] = 1; // 0 这个数的余数int sum = 0, ret = 0;for (auto x : nums) {sum += x;                  // 算出当前位置的前缀和int r = (sum % k + k) % k; // 修正后的余数if (hash.count(r))ret += hash[r]; // 统计结果hash[r]++;}return ret;}
};

525. 连续数组

把数组里面0全变为-1,就变相于求和为0的最长子字符串。

在i下标前找前缀和==sum[i]的下标,哈希表<前缀和,下标>.如果是相同的前缀和就不用更换下标,因为原本记录的下标距离i最远,和为k的子数组更长。

前缀和==0的情况,把下标设为-1

class Solution {
public:int findMaxLength(vector<int>& nums) {for(auto &o:nums)if(o==0) o=-1;int n=nums.size(),sum=0;int re=0;unordered_map<int,int> hs;hs[0]=-1;for(int i=0;i<n;i++){sum+=nums[i];if(hs.count(sum))re=max(i-hs[sum],re);else hs[sum]=i;}return re;}
};

1314. 矩阵区域和

answer[i][j]值 为以mat[i][j]为中心向四周扩张k个元素的长度,所圈起元素的和。

eg.answer[1][1]值 为以mat[1][1]==5为中心向四周扩张1个元素的长度,即1+2+3+...+9的和

解法:二维数组前缀和

求二维数组前缀和创建的数组,一般在原数组的行和列再加1.便于处理边界问题

还记得怎么求二维数组前缀和吗?

dp[i][j]的值为上面图像的整个面积。

dp[i][j]=dp[i][j-1](左边面积)+dp[i-1][j](上面面积)-dp[i-][j-1](A多余的面积)+mat[i][j](右小块的面积)

怎么用二维数组前缀和来求下图右下角面积?

我们有了二维数组前缀和,只需要知道x1,y1,x2,y2下标就可以了。

右下加面积=dp[x2][y2]-dp[x2][y1-1]-dp[x1-1][y2]+dp[x1-1][y1-1]

现在我们有了二维数组前缀和,就可以求mat二维数组中任意一块的元素和。

求所圈起元素的和,我们就需要知道该图形的左上角(x1,y1),右下角(x2,y2),

x1=i-k x2=i+k y1=j-k y2=j+k

但不能超出数组范围(m行n列)

所以x1=max(0,i-k) x2=min(m-1,i+k) y1=max(0,j-k) y2=min(n-1,j+k)

但是我们dp[][]是从下标1开始填入有效值,mat数组从0开始,我们就需要+1建立映射关系。

所以x1=max(0,i-k)+1 x2=min(m-1,i+k)+1 y1=max(0,j-k)+1 y2=min(n-1,j+k)+1

class Solution {
public:vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {int m = mat.size(), n = mat[0].size();vector<vector<int>> dp(m + 1, vector<int>(n + 1));// 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] - dp[i - 1][j - 1] +mat[i - 1][j - 1];// 2. 使⽤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;}
};

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

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

相关文章

(转载)Tools for Learning LLVM TableGen

前提 最近在学习有关llvm的东西&#xff0c;其中TableGen占了一部分&#xff0c;所以想特意学习下TableGen相关的语法。这里找到了LLVM官网的一篇介绍TableGen的博客&#xff0c;学习并使用机器翻译为中文。在文章的最后也添加了一些学习TableGen的资源。 原文地址&#xff1…

Python酷库之旅-第三方库Pandas(182)

目录 一、用法精讲 841、pandas.api.types.is_complex函数 841-1、语法 841-2、参数 841-3、功能 841-4、返回值 841-5、说明 841-6、用法 841-6-1、数据准备 841-6-2、代码示例 841-6-3、结果输出 842、pandas.api.types.is_float函数 842-1、语法 842-2、参数 …

CSS基础学习篇——选择器

学习文档连接&#xff1a;CSS层叠样式表 1.全局选择器&#xff1a;* * {margin: 0;padding: 0;font-size: 18px; }2.类&#xff08;clss&#xff09;选择器&#xff0c;以 . 开头 .container {display: flex;justify-content: space-around;align-items: center;width: 1200…

Marin说PCB之电源的Surface Current Density知多少?

小编我是一位资深的国漫迷&#xff0c;像什么仙逆&#xff0c;斗破&#xff0c;斗罗&#xff0c;完美世界&#xff0c;遮天&#xff0c;凡人修仙传&#xff0c;少年歌行等&#xff0c;为了可以看这些视频小编我不惜花费了攒了很多年的私房钱去开了这个三个平台的会员啊&#xf…

Oracle视频基础1.3.3练习

1.3.3 检查数据库启动情况 ps -ef | grep oracle启动数据库 sqlplus /nolog conn / as sysdba修改 fast_start_mttr_target 参数为初始值-50&#xff0c;缺省 scope 和 sid&#xff0c;查看修改结果 show parameter fast; alter system set parameter 250; show parameter fa…

CSS flex布局- 最后一个元素占满剩余可用高度转载

效果图 技术要点 height父元素必须有一个设定的高度flex-grow: 1 flex 盒子模型内的该元素将会占据父容器中剩余的空间F12检查最后一行的元素&#xff0c;高度就已经改变了&#xff1b;

基于vue框架的的驾校预约管理系统设计d5tq3(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,驾校教练,车辆信息,报名信息,学员信息,考试预约,教学课程,教练评价,考试成绩,练车预约,报修申请,维修信息,课程类型,车辆类型 开题报告内容 基于Vue框架的驾校预约管理系统设计开题报告 一、项目背景与意义 随着驾驶培训行业的快…

shell脚本编写注意细节 ==、=等的区别

文章目录 和的使用主要区别小结 Shell脚本要注意的细节1. 变量引用和空格处理2. [[ ... ]] vs [ ... ]3. 使用-n和-z来检测变量是否为空4. 整数运算和浮点运算5. 避免使用反引号执行命令6. for循环中的命令替换7. 使用trap来清理临时文件8. 避免使用硬编码路径9. 使用-eq、-lt、…

Docker Swarm简介

注意事项 Swarm 模式是用于管理 Docker 守护进程集群的一项高级特性。如果你打算将 Swarm 用作生产运行时环境&#xff0c;那就使用 Swarm 模式。如果你不打算使用 Swarm 进行部署&#xff0c;可改用 Docker Compose。如果正在为 Kubernetes 部署进行开发&#xff0c;可以考虑使…

接口测试及常用接口测试工具(postman/jmeter)详解

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#…

CVE-2024-51567 CyberPanel upgrademysqlstatus 远程命令执行

该漏洞源于upgrademysqlstatus接口未做身份验证和参数过滤&#xff0c;未授权的攻击者可以通过此接口执行任意命令获取服务器权限&#xff0c;从而造成数据泄露、服务器被接管等严重的后果。 影响版本 CyberPanel v2.3.5CyberPanel v2.3.6 目前官方已有可更新版本&#xff0…

Kaggle “Reducing Commercial Aviation Fatalities” 比赛 生理数据分析

1、背景 Kaggle在2018 年 12 月 20 日举办“Reducing Commercial Aviation Fatalities” 比赛&#xff0c;通过收集飞行员的生理数据&#xff0c;判断飞行员何时会遇到麻烦吗&#xff1f;该比赛主要分析飞行员的问题&#xff0c;因为航班多、时间不固定&#xff0c;飞行员会出…

无套路领取《AI应用开发专栏》

最近有些时间没有更新技术文章了&#xff0c;都在忙着写《AI应用开发入门》专栏&#xff0c;专栏已整理放到了github上&#xff0c;有兴趣的小伙伴可以移步github阅读&#xff0c;地址见文末。 1、为什么写这个文档 之前陆续写了一些零散的AI相关的技术文章&#xff0c;也有不…

Webserver(1.8)操作函数

目录 文件属性操作函数access函数chmod函数chown函数truncate函数 目录操作函数mkdir函数rmdir函数rename函数chdir函数*getcwd函数 目录遍历函数*opendir函数*readdir函数closedir函数 dup、dup2函数dupdup2 fcntl函数 文件属性操作函数 access函数 判断某个文件是否有某个权…

基础IO -- 标准错误输出stderr

目录 1&#xff09;为什么要有 fd 为 2 的 stderr 2&#xff09;使2和1重定向到一个文件中 这里我们谈一下以前只是了解过的stderr 通过两段代码&#xff0c;显然&#xff0c;我们可以知道两个FILE*都是指向显示器的 对于重定向&#xff0c;只有stdout才会将打印的数据重定向…

基于Multisim的四位抢答器设计与仿真

四位选手进行抢答比赛&#xff0c;用基本门电路及集成逻辑器件构成四人抢答器。选手编号分别为1&#xff0c;2&#xff0c;3&#xff0c;4号&#xff0c;用S1&#xff0c;S2&#xff0c;S3&#xff0c;S4四个按钮作为抢答按钮&#xff0c;S0按钮为总清零按钮。当四人中任何一个…

Python毕业设计选题:基于Django+Vue的物资配送管理系统的设计与实现

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录界面 管理员功能界面 申领者管理 后勤处管理 物资信息管理 入库信息管理 …

网安秋招面试

《Java代码审计》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484219&idx1&sn73564e316a4c9794019f15dd6b3ba9f6&chksmc0e47a67f793f371e9f6a4fbc06e7929cb1480b7320fae34c32563307df3a28aca49d1a4addd&scene21#wechat_redirect 《Web安全》h…

springboot092安康旅游网站的设计与实现(论文+源码)_kaic

毕业设计&#xff08;论文&#xff09; 基于JSP的安康旅游网站的设计与实现 姓  名 学  号 院  系 专  业 指导老师 2021 年 月 教务处制 目 录 目 录 摘 要 Abstract 第一章 绪论 1.1 研究现状 1.2 设…

字符串逆序(c语言)

错误代码 #include<stdio.h>//字符串逆序 void reverse(char arr[], int n) {int j 0;//采用中间值法//访问数组中第一个元素和最后一个元素//交换他们的值&#xff0c;从而完成了字符串逆序//所以这个需要临时变量for (j 0; j < n / 2; j){char temp arr[j];arr[…