【优选算法必刷100题】第029~30题(前缀和算法):和为 K 的子数组、和可被K整除的子数组

【优选算法必刷100题】第029~30题(前缀和算法):和为 K 的子数组、和可被K整除的子数组

🔥艾莉丝努力练剑:个人主页

专栏传送门:《C语言》《数据结构与算法》C/C++干货分享&学习过程记录Linux操作系统编程详解笔试/面试常见算法:从基础到进阶

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平


🎬艾莉丝的简介:



🎬艾莉丝的算法专栏简介:


目录

029  和为 K 的子数组

1.1  算法思路:前缀和+哈希表~>将前缀和存在哈希表中

1.2  算法实现

1.2.1  C++实现

1.2.2  Java实现

1.3  博主手记

030  和可被K整除的子数组

2.1  解法一:暴力枚举

2.2  解法二:前缀和(余数)存在哈希表中

2.2.1  补充知识

2.2.1.1  (数学公式)同余定理

2.2.1.2  c++中负数取模的结果,以及如何修正【负数取模】的结果

2.2.2  算法思路

2.3  算法实现

2.3.1  C++实现

2.3.2  Java实现

2.4  博主手记

结尾


029  和为 K 的子数组

力扣链接:560. 和为 K 的子数组

力扣题解链接:前缀和 + 哈希表解决【和为 K 的子数组】问题

题目描述:

1.1  算法思路:前缀和+哈希表~>将前缀和存在哈希表中

参考下图:

设为数组中的任意位置,用sum[ i ]表示[0 , i]区间内所有元素的和。

如果想知道有多少个【以为结尾的和为的子数组】,就要找到有多少个起始位置为x1,x2,x3...使得[x , i]区间内的所有元素的和为k。那么[0 , x]区间内的和是不是就是sum[ i ] - k了。于是问题就变成——

找到在[0 , i - 1]区间内,有多少前缀和等于sum[ i ] - k的即可。

我们不需要真的去初始化一个前缀和数组,因为我们只关心在 i 位置之前,有多少个前缀和会等于sum[ i ] - k。因此,我们仅需用一个哈希表,一边求当前位置的前缀和,一边存下之前每一种前缀和出现的次数。

1.2  算法实现

1.2.1  C++实现

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; } };
时间复杂度:O(n),空间复杂度:O(1)。

1.2.2  Java实现

// Java写法 class Solution { public int subarraySum(int[] nums, int k) { Map<Integer, Integer> hash = new HashMap<Integer, Integer>(); hash.put(0, 1); int sum = 0, ret = 0; for (int x : nums) { sum += x; // 计算当前位置的前缀和 ret += hash.getOrDefault(sum - k, 0); // 统计结果 hash.put(sum, hash.getOrDefault(sum, 0) + 1); // 把当前的前缀和丢到哈希表里面 } return ret; } }
时间复杂度:O(n),空间复杂度:O(1)。

1.3  博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己能够推导很重要!


030  和可被K整除的子数组

本题是某一年的蓝桥杯竞赛原题哦!桀桀桀,大家做做看吧!

力扣链接:974. 和可被 K 整除的子数组

力扣题解链接:前缀和 + 哈希表解决【和可被K整除的子数组】问题

题目描述:

2.1  解法一:暴力枚举

暴力解法就是枚举出所有的子数组的和,这里不再赘述。

2.2  解法二:前缀和(余数)存在哈希表中

2.2.1  补充知识

2.2.1.1  (数学公式)同余定理

如果(a - b)% n == 0,那么我们可以得到一个结论:a % n == b % n。用文字叙述就是,如果两个数相减的差能被n整除,那么这两个数对n取模的结果相同。

例如:(26 - 2) %12 == 0,那么26 %12 == 2 % 12 == 2。
2.2.1.2  c++中负数取模的结果,以及如何修正【负数取模】的结果

(1)c++中关于负数的取模运算,结果是【把负数当成正数,取模之后的结果加上一个负号】。

例如:-1 % 3 = (-1 % 3) = -1

(2)因为有负数,为了防止发生【出现负数】的结果,以(a%n+n)%n的形式输出保证为正。

例如:-1 % 3 =(-1 % 3 + 3) % 3 = 2

2.2.2  算法思路

思路与560.和为K的子数组这道题的思路相似。

还是用这张图——

设为数组中的任意位置,用sum[ i ]表示[0,i]区间内所有元素的和。

1、想知道有多少个「以i为结尾的可被k整除的子数组」,就要找到有多少个起始位置为x1,x2,x3...使得[x,i]区间内的所有元素的和可被k整除。

2、设[0,x - 1]区间内所有元素之和等于a,[0,i]区间内所有元素的和等于,可得(b - a) % k == 0。

3、由同余定理可得,[0,x - 1]区间与[0,i]区间内的前缀和同余。于是问题就变成——

(1)找到在[0,i-1]区间内,有多少前缀和的余数等于sum[ i ] % k的即可。

我们不用真的初始化一个前缀和数组,因为我们只关心在 i 位置之前,有多少个前缀和等于sum[ i ] - k。因此,我们仅需用一个哈希表,一边求当前位置的前缀和,一边存下之前每一种前缀和出现的次数。

2.3  算法实现

2.3.1  C++实现

class Solution { public: int subarraysDivByK(vector<int>& nums, int k) { unordered_map<int,int> hash; // 统计前缀和出现的次数 // 处理细节 hash[0] = 1; // 这里存的依旧是余数,只不过0 % k还是0,所以这里存的是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; } };
时间复杂度:O(n),空间复杂度:O(1)。

2.3.2  Java实现

// Java写法 class Solution { public int subarraysDivByK(int[] nums, int k) { Map<Integer, Integer> hash = new HashMap<Integer, Integer>(); hash.put(0 % k, 1); int sum = 0, ret = 0; for (int x : nums) { sum += x; // 计算当前位置的前缀和 int r = (sum % k + k) % k; ret += hash.getOrDefault(r, 0); // 统计结果 hash.put(r, hash.getOrDefault(r, 0) + 1); } return ret; } };
时间复杂度:O(n),空间复杂度:O(1)。  

2.4  博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己能够推导很重要!


结尾

往期回顾:

【优选算法必刷100题】第027~28题(前缀和算法):寻找数组的中心下标、除自身以外数组的乘积

结语:既然都看到这里啦!就请大佬不要忘记给博主来个“一键四连”哦!

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡

૮₍ ˶ ˊ ᴥ ˋ˶₎ა


Read more

鸿蒙金融理财全栈项目——上线与运维、用户反馈、持续迭代

鸿蒙金融理财全栈项目——上线与运维、用户反馈、持续迭代

《鸿蒙APP开发从入门到精通》第22篇:鸿蒙金融理财全栈项目——上线与运维、用户反馈、持续迭代 🚀📱🔧 内容承接与核心价值 这是《鸿蒙APP开发从入门到精通》的第22篇——上线与运维、用户反馈、持续迭代篇,100%承接第21篇的合规审计优化、风险控制优化、产品创新优化架构,并基于金融场景的上线与运维、用户反馈、持续迭代要求,设计并实现鸿蒙金融理财全栈项目的上线与运维、用户反馈、持续迭代功能。 学习目标: * 掌握鸿蒙金融理财项目的上线与运维设计与实现; * 实现应用上线、应用运维、应用监控; * 理解用户反馈在金融场景的核心设计与实现; * 实现用户反馈收集、用户反馈分析、用户反馈处理; * 掌握持续迭代在金融场景的设计与实现; * 实现持续集成、持续部署、持续交付; * 优化金融理财项目的用户体验(上线与运维、用户反馈、持续迭代)。 学习重点: * 鸿蒙金融理财项目的上线与运维设计原则; * 用户反馈在金融场景的应用; * 持续迭代在金融场景的设计要点。 一、 上线与运维基础 🎯 1.1 上线与运维定义 上线与运维是指对金融理财项目的

By Ne0inhk
夸克网盘免费资源电子书籍安卓软件经典游戏音乐歌曲精品教程AI绘画学习资料合集

夸克网盘免费资源电子书籍安卓软件经典游戏音乐歌曲精品教程AI绘画学习资料合集

一、夸克网盘免费资源说明 夸克网盘免费资源,来自全网整理二次精选,涵盖了几乎所有资源类型,网盘资源目录的分享链接,仅限一级目录和二级目录,一级目录是网盘资源的根目录,包括电子书籍、软件资源、游戏资源、视频资源、音乐音频、美食技术和学习资料等,二级目录是一级目录的子目录,均为资源专题形式,比如,Kindle原版书籍合集、U盘车载音乐歌曲、DeepSeek全套资源、全网专业摄影书籍、TikTok全球解锁版本、IOS巨魔专用资源、TED演讲视频合集、剪映教学全套资源、全网热门漫画精选,等等,相信其中会有你所需要的。 特别说明: 1、夸克网盘与百度网盘不同,不仅支持查看分享链接的资源大小,而且支持在分享链接页面里搜索资源,可以查询其中是否有你所需要的。 2、夸克官方一直都有福利活动,新用户可以免费领取1TB空间,具体操作方法请查看文本文件(在分享链接里)。 3、一级目录《全网精选2000T优质资料》,提供了很有价值的海量夸克资源,分享链接存放在电子表格里,整个目录大小只有9.7M,建议转存收藏。 二、夸克网盘一级目录资源 电子书籍+

By Ne0inhk
Paperzz 期刊论文智能写作:让学术投稿从 “难产” 到 “高产” 的破局之道

Paperzz 期刊论文智能写作:让学术投稿从 “难产” 到 “高产” 的破局之道

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿paperzz - 期刊论文https://www.paperzz.cc/journalArticle 在学术研究的金字塔中,期刊论文是衡量研究者能力的核心标尺,也是学术成果走向同行认可的必经之路。然而,对于大多数科研人而言,期刊论文写作与投稿始终是一道难以逾越的鸿沟:从选题构思到框架搭建,从文献梳理到内容填充,从格式规范到语言润色,每一个环节都充满了挑战。传统的写作模式不仅效率低下,还容易陷入 “反复修改、屡屡被拒” 的循环,让不少研究者在学术道路上步履维艰。 Paperzz 的期刊论文智能写作功能,正是为破解这一困境而生。它以 AI 技术为核心,重构了期刊论文的创作全流程,将选题、框架、内容、格式、润色等环节深度整合,让学术写作从 “个体攻坚” 升级为 “智能协同”。无论是初出茅庐的青年学者,还是经验丰富的资深研究者,都能借助这一工具,大幅提升写作效率与投稿成功率,让学术成果更快、更稳地走向学术舞台。 一、期刊论文写作的

By Ne0inhk
[源力觉醒 创作者计划]_文心一言 4.5开源深度解析:性能狂飙 + 中文专精

[源力觉醒 创作者计划]_文心一言 4.5开源深度解析:性能狂飙 + 中文专精

文章目录 * [源力觉醒 创作者计划]_文心一言 4.5开源深度解析:性能狂飙 + 中文专精 * 一. 部署实战:单卡环境的极速落地 * 1.1 🖥️ 环境配置の手把手教程 📝 * 部署准备:硬件与镜像 * 依赖安装:一行代码搞定 * 1.2 🚀 模型启动の参数与验证 ✅. * 二. 多场景能力验证:从工业到学术 * 2.1 🏥 医疗影像诊断:从模糊影像到病灶定位 * 2.2 🚦 交通流优化:动态拥堵预测与策略设计 * 2.3 🔍 考古文本破译:甲骨文符号的跨学科解读 * 三. 性能优化与问题解决 * 3.1 🚀 性能优化策略:让模型跑得更快 * 3.2 🛠️ 常见错误解决方案 * 四. 与同类模型对比 * 🍬 核心优势对比🍭 * 🍬 对比结论🍭 * 五、

By Ne0inhk