力扣刷题笔记13:哈希表+前缀和经典题目
1.连续的子数组和

解题思路:我们可以发现如果sum[i]%k==sum[j]%k(sum[i],sum[j]分别表示数组中前i个和前j个元素之和),则i到j之间的元素之和必是k的倍数,我们只需判断j-i是否大于等于2即可
我们却可以创建一个哈希表,key来储存当前前缀和的余数,value则储存对应的index,如果哈希表中存在其对应的余数,取出其pos,看当前的下标 index到 pos的距离是否大于等于2. 如果是则返回true。不是我们则继续遍历。不要更新哈希表中的下标!(贪心的思维)如果不存在则将当前余数与其对应的下标储存在哈希表中。
核心:当两个不同位置的前缀和对 k的取余相同时,我们看这两个位置的下标是否距离大于等于2. 如果满足以上条件,我们即找到了一个连续数组的和是 k的倍数。
具体代码如下:

2.和为k的子数组

解题思路:
建立map表s用于存储每个连续子数组sum求和出现的次数,初始化为(0,1),表示和为0的连续子数组出现1次。sum的值是在对nums数组的循环中不断累加当前元素的,res的值则需要查找map中是否已存在sum-k的元素,也就是在查找此前所有从0项开始累加的连续子项和中有没有sum-k。如果有的话,则说明从该项到当前项的连续子数组和必定为k,那么res则可以和s[sum-k]相加得到新的res,并使s[sum-k]++。
具体代码如下:

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

解题思路:这道题是第一题和第二题的结合,我们同样需要建立map表s用于存储每个连续子数组sum%k的值求和出现的次数,初始化为(0,1),表示余数为0的连续子数组出现1次res的值则需要查找map中是否已存在sum%k的元素,也就是在查找此前所有从0项开始累加的连续子项和中有没有sum%k。如果有的话,则说明从该项到当前项的连续子数组和必定为k的倍数,那么res则可以和s[sum%k]相加得到新的res,并且使s[sum%k]++;
具体代码如下:

4.连续数组

解题思路:这道题也是一道典型的前缀和问题,我们可以把nums数组中的0全部变为-1,那么这道题就变成了和为0的最长连续子数组。剩下的过程和第二题类似,不同的是此时我们的s储存的是sum的值和当前下标,并且如果s.count(sum)!=0我们不需要更新s[sum]的值。
具体代码如下:

浙公网安备 33010602011771号