【优选算法必刷100题】第029-030题(前缀和):和为k的子数组,和可被k整除的子数组

【优选算法必刷100题】第029-030题(前缀和):和为k的子数组,和可被k整除的子数组

🔥个人主页:Cx330🌸

❄️个人专栏:《C语言》《LeetCode刷题集》《数据结构-初阶》《C++知识分享》

《优选算法指南-必刷经典100题》《Linux操作系统》:从入门到入魔

🌟心向往之行必能至


🎥Cx330🌸的简介:


目录

前言:

29. 和为k的子数组

算法原理(前缀和+哈希):

前缀和解法代码(C++):

博主手记(字体还请见谅哈):

30. 和可被k整除的子数组

算法原理(前缀和+哈希):

前置知识补充:

前缀和解法代码(C++):

博主手记(字体还请见谅哈):

结尾:


前言:
聚焦算法题实战,系统讲解三大核心板块:“精准定位最优解”——优选算法,“简化逻辑表达,系统性探索与剪枝优化”——递归与回溯,“以局部最优换全局高效”——贪心算法,讲解思路与代码实现,帮助大家快速提升代码能力

前缀和专题


29. 和为k的子数组

题目链接:

560. 和为 K 的子数组 - 力扣(LeetCode)

题目描述:

题目示例:

算法原理(前缀和+哈希):

思路:

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

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

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

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

前缀和解法代码(C++):

class Solution { public: int subarraySum(vector<int>& nums, int k) { unordered_map<int,int> hash; hash[0]=1; int n=nums.size(); int sum=0,ret=0; for(auto x:nums) { sum+=x; if(hash.count(sum-k)) ++ret; hash[sum]++; } return ret; } };

博主手记(字体还请见谅哈):


30. 和可被k整除的子数组

题目链接:

974. 和可被 K 整除的子数组 - 力扣(LeetCode)

题目描述:

题目示例:

算法原理(前缀和+哈希):

前置知识补充:

同余定理:

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

例如:(26 - 2) \% 12 == 0,那么 26 % 12 == 2 % 12 == 2

负数取模问题:

  • c++ 中关于负数的取模运算,结果是「把负数当成正数,取模之后的结果加上一个负号」。 例如:-1 % 3 = -(1 % 3) = -1
  • 因为有负数,为了防止发生「出现负数」的结果,以 (a % n + n) % n 的形式输出保证为正。例如:-1 \% 3 = (-1 % 3 + 3) % 3 = 2

思路:

与上道题思路一样

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

  • 想知道有多少个「以 i 为结尾的可被 k 整除的子数组」,就要找到有多少个起始位置为 x1, x2, x3... 使得 [x, i] 区间内的所有元素的和可被 k 整除
  • 【0,x-1】区间内所有元素之和等于 a ,【0,i】区间内所有元素的和等于 b,可得 (b - a)% k == 0
  • 由同余定理可得,【0,x-1】区间与【0,i】区间内的前缀和同余。于是问题就变成:找到在【0,i-1】区间内,有多少前缀和的余数等于 sum[i] % k 的即可

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

前缀和解法代码(C++):

class Solution { public: int subarraysDivByK(vector<int>& nums, int k) { unordered_map<int,int> hash; hash[0%k]=1;//0这个数的余数 int sum,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),展示了前缀和技巧在子数组统计问题中的高效应用

Read more

【高阶数据结构】二叉搜索树

【高阶数据结构】二叉搜索树

二叉搜索树 * 1.二叉搜索树的概念 * 2.二叉搜索树的性能分析 * 3.二叉搜索树的实现 * 1.二叉搜索树的结构 * 2.二叉搜索树的插入 * 3.二叉搜索树的查找 * 4.二叉搜索树的删除 * 5.二叉搜索树的中序遍历 * 6.默认构造 * 7.拷贝构造 * 8.赋值重载 * 9.析构函数 * 4.二叉搜索树key和key/value使用场景 * 1.key搜索场景(set容器) * 2.key/value搜索场景(map容器) * 5.key二叉搜索树代码 * 6.key/value二叉搜索树代码 1.二叉搜索树的概念 二叉搜索树又称搜索二叉树,它或者是一棵空树,或者是具有以下性质的⼆叉树: 若它的左子树不为空,则左子树上所有结点的值都小于等于根结点的值。若它的右子树不为空,则右子树上所有结点的值都大于等于根结点的值。

By Ne0inhk
Redis魔法学院——第四课:哈希(Hash)深度解析:Field-Value 层级结构、原子性操作与内部编码优化

Redis魔法学院——第四课:哈希(Hash)深度解析:Field-Value 层级结构、原子性操作与内部编码优化

引言: 在Redis中,哈希结构还有一层更深的意义,跟我们习以为常的key-value的哈希结构有所不同的是,还有一层更深的意义,我们由此来引入filed这个概念~ Redis 自身已经是键值对结构了 Redis 自身的键值对就是通过 哈希 的方式来组织的. 把 key 这一层组织完成之后, 到了 value 这一层~~ value 的其中一种类型还可以再是哈希! 形如 key="key",value={{field1, value1},…, {fieldN,valueN }},Redis 键值对和哈希类型二者的关系可以用下图表示。 field-value和key-value的深层次解析: 在Redis中,field-value和key-value是层级嵌套关系,其中key是全局唯一标识符,指向一个哈希(Hash)结构;而field是该哈希内部的字段名,与对应的value组成键值对,存储在哈希中。以下是具体分析: 1. 层级关系:全局Key → 哈希结构 → 多个Field-Value * 全局Key:Redis中的每个数据对象(

By Ne0inhk
【优选算法】双指针算法:专题一

【优选算法】双指针算法:专题一

目录 引言: 【283.移动零】 1、题目描述 2、实现核心及思路 解题思路: 思路可视化: 代码实现: 代码测试: 【1089.复写零】 1、题目描述 2、实现核心及思路 解题思路: 思路可视化: 代码实现: 代码测试: 【202. 快乐数】 1、题目描述 2、实现核心及思路 解题思路: 代码实现: 【11. 盛水最多容器】 1、题目描述 2、实现核心及思路 解题思路: 思路可视化: 代码实现: 引言: 常见的双指针有两种形式,一种是对撞指针,一种是快慢指针。 对撞指针:一般用于顺序结构中,也称左右指针。 • 对撞指针从两端向中间移动。一个指针从最左端开始,另一个从最右端开始,然后逐渐往中间逼近。

By Ne0inhk
【数据结构】深入解析选择排序与堆排序:从基础到高效实现的完全指南

【数据结构】深入解析选择排序与堆排序:从基础到高效实现的完全指南

文章目录 * 选择排序 * 1基本思想: * 2 直接选择排序: * 3. 堆排序 * 基本思想 * 堆排序的C语言实现 * 堆排序的工作原理 * 堆排序的性能分析 * 4. 选择排序与堆排序的比较 * 5. 选择排序的变种与优化 * 结语 * 结语 选择排序 1基本思想: 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的 数据元素排完 。 2 直接选择排序: 在元素集合array[i]–array[n-1]中选择关键码最大(小)的数据元素 若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换 在剩余的array[i]–array[n-2](array[i+1]–array[n-1])集合中,

By Ne0inhk