【前缀和算法】--- 进阶题目赏析

news2024/9/20 0:41:16

 Welcome to 9ilk's Code World

       

(๑•́ ₃ •̀๑) 个人主页:        9ilk

(๑•́ ₃ •̀๑) 文章专栏:      算法Journey


本篇我们来赏析前缀和算法的进阶题目。


🏠 和可被K整除的子数组

📌 题目解析

和可被k整除的子数组

📌 算法原理

这道题与"和为K的子数组"其实是类似的,我们以i位置为结尾的子数组观察,如果能找到一段右边部分能被k整除,此时问题转化成在这段区间内找有多少个前缀和等于x使得sum[i] -x 能被k整除?

  • 同余定理
如果 (a - b) % n == 0 ,那么我们可以得到⼀个结论: a % n == b % n 。⽤⽂字叙述就是,如果两个数相减的差能被 n 整除,那么这两个数对 n 取模的结果相同。
因此我们只需要找是否有x对k的余数等于sum对k的余数即可。
  • 前缀和为负数的情况

以K=4为例子,求出某个前缀和为-1,-1%K应该为3,但有的编程语言-1%K = -1(不同编程语言对商的取整是不同的,有的向0取整,有的向负无穷取整).这里的-1应该要加上K,转正成3.这是因为-1和3分别模4结果看似不相等,但是3-(-1) = 4,4%4 == 0,所以前缀和-1和3其实是等价的,只是不同语言对%运算的处理不同。

---》修正:我们应该让正负统一,毕竟他们是等价的,即求余数(a%p + p)%p

问题转化为:在[ 0 , i - 1]区间内,找到有多少个前缀和的余数等于(sum%k+k)%k

我们哈希表此时存的不是前缀和,而是求前缀和的余数!

参考代码:

class Solution {
public:
    int subarraysDivByK(vector<int>& nums, int k) 
    {
       int sum =  0;
       int n = nums.size();
       unordered_map<int,int> hash;
       int count = 0;
       hash[0] = 1;//sum[i]恰好就是能被整除
       for(int i = 0  ; i < n;i++)
       {
           sum += nums[i];
           int leftnum =  (sum%k + k)%k;
           if(hash[leftnum]) count += hash[leftnum];
           hash[leftnum]++;
       }
       return count;

    }

};

🏠 连续数组

📌 题目解析

连续数组

  • 数组中的数字不是0就是1。

📌 算法原理

本题也是能很好地转化,如果我们将所有的0转化为-1,此时问题转化为在数组中找最长的子数组,使子数组中所有元素为0(和为0的子数组)。

  • 由于涉及最长的子数组,哈希表里应该存的是某个位置的前缀和和这个位置的下标。
  • 使用完i位置之后,再将其丢进哈希表。
  • 长度求法:i - j.

  • 如果重复的<sum,i>,此时我们只需保留前面的那一对。(因为我们要最长的子数组,也就是要sum[i] - 0 = sum这个前缀和越短越好)
  • 默认前缀和为0的情况,此时表示sum正好为0,我们需要在这段区间的左边找等于0的子数组,显然是不存在的,因此设置hash[0] = -1即可。

参考代码:

class Solution 
{

public:
 int findMaxLength(vector<int>& nums) 
 {
   unordered_map<int, int> hash;
   hash[0] = -1; // 默认有⼀个前缀和为 0 的情况
   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;
 }
};

🏠 矩阵区域和

📌 题目解析

矩阵的区域和

📌 算法原理

  • 由于i - k <= r <= i + k 和 j - k <= c <= j + k,所以r和c都分别有最大值和最小值,问题转化为求某块区域的面积,可以用到我们的二维前缀和,具体可跳转至前缀和模板
  • 由于i-k和i+k/j-k和j+k可能超出行数和列数,所以当超过时,我们应该取二维的边界。

参考代码:

class Solution {
public:
    vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) 
    {
        //
     	int n = mat.size();
		int m = mat[0].size();
		vector<vector<int>> dp(n + 1, vector<int>(m + 1));
		vector<vector<int>> answer(n, vector<int>(m));
        //获得二维前缀和数组
		for (int i = 1; i <= n; i++)
		{
			for (int j = 1; j <= m; j++)
			{
				dp[i][j] = dp[i][j - 1] + dp[i - 1][j] + mat[i - 1][j - 1] - dp[i - 1][j - 1];
			}
		}
    //使用前缀和数组
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < m; j++) 
            {  //确定下标
				int x1 = ((i - k) < 0) ? 0 : i - k;
				int x2 = (i + k >= n) ? n - 1 : i + k;
				int y1 = (j - k < 0) ? 0 : j - k;
				int y2 = (j + k >= m) ? m - 1 : j + k;
				answer[i][j] = dp[x2 + 1][y2 + 1] - dp[x2 + 1][y1] - dp[x1][y2 + 1] + dp[x1][y1];
			}
		}

		return answer;
    }
};

通过这几道题我们可以发现,在做前缀和题目我们当要求一段连续区间(比如子数组)可以想到用前缀和,此时需要进行适当的转化。

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

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

相关文章

软件单元测试工程模版化

一、简介 在汽车领域混了这么多年也做了不少项目&#xff0c;发现很多公司对软件单元测试和代码覆盖率测试根本不重视&#xff0c;或者开发流程就没有单元测试这个流程。但是有的客户需要评审单元测试这个流程&#xff0c;需要有相关的单元测试报告和代码覆盖率统计的报告。如…

百度 AI Studio 脚本任务篇,它不同于notebook任务是支持免费的, 脚本任务是需要算力卡的,更好的算力 支持四张显卡,

aistudio 脚本任务是需要算力卡的&#xff0c;是收费的一个项目&#xff0c;估计是运行效率更高&#xff0c;支持4张显卡&#xff0c;同时计算。 # -*- coding: utf-8 -*- """ 空白模板 """ ###### 欢迎使用脚本任务&#xff0c;首先让我们熟悉…

计算机毕设选题推荐-基于python的豆瓣电子图书数据可视化分析

&#x1f496;&#x1f525;作者主页&#xff1a;毕设木哥 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 实战项目 文章目录 实战项目 一、基于python的豆瓣电子图书数…

插入排序代码实现(java)

简介&#xff1a; 也是一种简单的排序方法&#xff0c;其基本操作是将一条记录插入到已排好的有序表中&#xff0c;从而得到一个新的、记录数量增的有序表 说明&#xff1a; 拿一维数组来说&#xff0c;可以把第一个元素看成一个有序表&#xff0c;后面的元素看成无序表&am…

《中文Python穿云箭量化平台二次开发技术08》获取大盘涨跌家数、平均股价数据等来判断市场涨跌趋势,并在策略中自动控制多空交易

《中文Python穿云箭量化平台》是纯Python开发的量化平台&#xff0c;因此其中很多Python模块&#xff0c;我们可以自己设计新的量化工具&#xff0c;例如自己新的行情软件、新的量化平台、以及各种量化研究工具。 穿云箭自带指标公式源码运行模块&#xff0c;可以为其他量化平台…

莫比乌斯反演总结

目录 前置知识1.1 线性筛 (欧拉筛)1.2 整除分块 (数论分块)引理 1引理 2引理 3实现例 1例 2例 3例 4 1.3 数学知识积性函数莫比乌斯函数狄利克雷(Dirichlet)卷积 莫比乌斯反演2.1 公式2.2 常用~(唯一)~结论2.3 例题例 1例 2例 3例 4例 5练习 1练习 2练习 3练习 4 懵逼乌斯反演总…

配置nginx安全连接ssl(购买域名、获取ssl证书)

以前了解过ssl配置比较麻烦&#xff0c;需要弄挺多东西。 1、购买域名、获取ssl证书 2、安装nginx的ssl模块 3、配置config 1、购买域名、获取ssl证书 可以在腾讯云、阿里云购买域名&#xff0c;然后申请免费的ssl证书&#xff0c;因为免费的证书需要域名才能申请&#xff0…

docker安装配置、docker命令

一、CentOS7安装docker 1、安装 Docker CE 支持 64 位版本 CentOS 7&#xff0c;并且要求内核版本不低于 3.10&#xff0c; CentOS 7 满足最低内核的要求&#xff0c;所以我们在CentOS 7安装Docker。 卸载旧docker 如果之前安装过旧版本的Docker&#xff0c;可以使用下面命令…

Codeforces Round 964 (Div. 4) A-E Java题解

比赛地址 Dashboard - Codeforces Round 964 (Div. 4) - Codeforces A题 签到题 给一个两位数 求各位上的数字和 直接对10取余加上本来的数除以10 // 注意类名必须为 Main, 不要有任何 package xxx 信息 // package Dduo; import java.io.*; import java.math.*; import j…

22:差分线规则

1.那些线是差分对&#xff1a; ①有些特定模块就是差分线&#xff1a;USB&#xff0c;HDMI, 以太网口&#xff0c;LEDS等 设置差分对 Panel打开PCB 输入&#xfe62;和- 点击执行 对90欧姆差分对和100Ω差分对进行分类 设置差分对线宽 ①90ohm 由excel可知&a…

孩子自闭症的主要表现:探寻理解之门

自闭症&#xff0c;也称为孤独症&#xff0c;是一种复杂的神经发展障碍&#xff0c;它影响着孩子的社交互动、沟通能力以及行为模式。当家长注意到孩子出现自闭症倾向时&#xff0c;及时识别并寻求专业帮助至关重要。以下是孩子自闭症的一些主要表现&#xff0c;希望能为家长提…

西安电子科技大学研究生新生大数据

西安电子科技大学研究生新生大数据&#xff0c;来自卓越工程学院—杭州研究院 杭研不少来自双非院校&#xff0c;西电也不怎么歧视双非的

游戏开发设计模式之模板方法模式

目录 模板方法模式在游戏开发中的具体应用案例是什么&#xff1f; 如何在不同类型的游戏&#xff08;如角色扮演游戏、策略游戏等&#xff09;中实现模板方法模式&#xff1f; 模板方法模式与其他设计模式&#xff08;如观察者模式、状态模式等&#xff09;相比&#xff0c;…

实战项目:俄罗斯方块(二)

文章目录 &#x1f34a;自我介绍&#x1f34a;俄罗斯方块数据存储三维数组的简单介绍俄罗斯方块数组的设计类型的设计初始值的方块库的设计输出指定位置的图形输出每种图形及其转换形式代码 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏…

MySQL出现锁等待Lock wait timeout exceeded该如何快速解决

目录 一、前言 二、锁等待是如何产生的&#xff1f; 三、如何避免锁等待&#xff1f; 四、出现锁等待&#xff0c;如何快速解决&#xff1f; 设置合理的锁等待超时时间 使用DBdoctor及时观测锁等待数据 五、总结 一、前言 在使用MySQL等数据库处理业务时&#xff0c;锁…

面对自闭症的孩子:理解、关爱与支持

自闭症&#xff0c;这个看似遥远却又时常出现在我们生活中的词汇&#xff0c;它影响着无数家庭和孩子。面对自闭症的孩子&#xff0c;我们或许会感到困惑、无助&#xff0c;但更重要的是&#xff0c;我们要给予他们理解、关爱与支持。 我们要做的是深入理解自闭症。自闭症是一种…

Linux创建sysfs属性节点 - DEVICE_ATTR宏、device_create_file()、sysfs_create_group()

目录 简介&#xff1a; 一、DEVICE_ATTR介绍 1、DEVICE_ATTR宏 1.1 参数说明 1.2 调用方法 二、sysfs创建属性文件 1、创建一个sysfs属性文件 1.1 device_create_file()函数 1.2 device_create_file()实例 2、创建多个sysfs属性文件 2.1 sysfs_create_group()函数 2…

AI少女/HS2甜心选择2 仿崩坏3卡系列全合集打包

内含AI少女/甜心选择2 仿崩坏3系列全合集打包共11张 内含&#xff1a;月魄装 幽兰黛尔幽兰黛尔薪炎之律者青鸟之庭帕朵菲莉丝雷电芽衣校服布洛妮娅八重樱 冰海琴音爱衣 悠闲旋律爱莉希雅EVA 明日香。 下载地址&#xff1a;https://www.51888w.com/241.html 部分演示图&#…

java构建工具-maven的复习笔记【适用于复习或者初步了解】

&#x1f939;‍♀️潜意识起点&#xff1a;个人主页 &#x1f399;座右铭&#xff1a;得之坦然&#xff0c;失之淡然。 &#x1f48e;擅长领域&#xff1a;前端 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是我持…

鸿蒙UIAbility组件进阶

鸿蒙UIAbility组件进阶 AbilityStage基本概念生命周期使用方式 UIAbility组件间交互启动应用内的UIAbility启动应用内的UIAbility并获取返回结果启动UIAbility的指定页面调用方目标UIAbility冷启动目标UIAbility热启动 AbilityStage 基本概念 在了解AbilityStage之前&#xf…