大家好,我是晴天学长,这是一个很重要的前缀和+hash运用的题,为后面很多的题打基础,需要的小伙伴可以关注支持一下哦!后续会继续更新的。
1) .和为k的子数组
2) .算法思路
和为k的子数组
1.首先是前缀和
2.根据关系
s【R】- s【L】=k
如果是0开头,就是本身
换算成
s【L】 =s【R】- k ;
那就一边前缀和,一边查找,然后一边存在hashmap,注意有负数。
3) .算法步骤
1.创建一个HashMap对象 map 用于存储前缀和与对应出现次数的映射关系。
2.初始化变量 answer 为0,表示符合条件的子数组个数。
3.检查第一个元素是否等于k,如果是,则 answer 加1,表示该元素本身就是一个满足条件的子数组。
将第一个元素和对应的出现次数放入 map 中。
4.使用一个循环遍历数组中的元素,从第二个元素开始。
5.将当前元素的值加上前一个元素的值,即求得当前位置的前缀和。
6.检查当前前缀和是否等于k,如果是,则 answer 加1。
7.检查 map 中是否包含前缀和减去k的值,如果是,则将对应的出现次数加到 answer 中。
8.将当前前缀和和对应的出现次数放入 map 中,更新映射关系。
9.循环结束后,返回 answer,表示满足条件的子数组个数。
4).代码示例
class Solution {
public int subarraySum(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>();
int answer = 0;
//S[R] = S[L]+K;
answer += k == nums[0] ? 1 : 0;
map.put(nums[0], map.getOrDefault(nums[0], 0) + 1);
for (int i = 1; i < nums.length; i++) {
nums[i] += nums[i - 1];
answer+=nums[i]==k?1:0;
if (map.containsKey(nums[i] - k)) {
answer+=map.get(nums[i] - k);
}
map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
}
return answer;
}
}
5).总结
- Hash和前缀和的正确使用。
试题链接: