马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
前缀和
前缀和又称累计和,是指将序列中从起始位置到当前位置的全部元素进行求和- prefixSum[0] = nums[0]
- prefixSum[1] = nums[0] + nums[1]
- prefixSum[2] = nums[0] + nums[1] + nums[2]
- ...
- prefixSum[i] = nums[0] + nums[1] + ... + nums[i]
复制代码 解题操作顺序
- 先求前缀和pre
- 判断当前pre-k是否在hashmap中并完成计数
- 最后将pre加入hashmap
560. 和为 K 的子数组
留意初始添加mp.put(0, 1),记录前缀和为0的次数为1
关键变量解析(pre,mp,count,均为全局变量)
1. pre(前缀和)
- 含义:从数组起始位置到当前位置 i 的全部元素之和,即 pre = nums[0] + nums[1] + ... + nums。
- 作用:将子数组和问题转化为前缀和的差值问题。比方,子数组 nums[j..i] 的和为 pre - pre[j]。
2. mp(哈希表)
- 含义:键为前缀和的值,值为该前缀和出现的次数。
- 作用:快速查询历史前缀和的出现次数,判断是否存在满意条件的子数组。
3. count(计数器)
- 含义:记录满意和为 k 的子数组的总数量。
- 作用:累加全部大概的子数组组合。
官方题解:
- public class Solution {
- public int subarraySum(int[] nums, int k) {
- int count = 0, pre = 0;
- HashMap < Integer, Integer > mp = new HashMap < > ();
- mp.put(0, 1);
- for (int i = 0; i < nums.length; i++) {
- pre += nums[i];
- if (mp.containsKey(pre - k)) {
- count += mp.get(pre - k);
- }
- mp.put(pre, mp.getOrDefault(pre, 0) + 1);
- }
- return count;
- }
- }
复制代码 我的第一次实现:
也不能用双指针,因为数据中大概包罗负数。
[code]public int subarraySum(int[] nums, int k) { int res = 0; int[] preSum = new int[nums.length+1]; preSum[0] = 0; for(int i=1;i |