leetcode 力扣 560 和为K的子数组

45 阅读1分钟

前缀和

思路跟 路径总和3 是一样的

算法思路

  • 使用前缀和currSum - k的数量间接反映和为k的连续子数组数量。
  • 使用一个变量currSum = 0计算当前和,即从0 + nums[0] + ... + nums[n - 1]。每加一次,判断是否存在前缀和currSum - k
  • 什么前缀和?比如,[1, 2, 3],如果k = 2,当currsum = 1 + 2 = 3currSum - k = 1,而之前的计算中存在currSum = 1,也就是存在前缀和为1。子数组和currSum = 3存在,前缀和currSum = 1存在,所以子数组和currSum = 2存在,也就是k存在。
  • 使用哈希表preSum来保存前缀和及它的数量,<currSum, numberOfcurrSum>
class Solution {
    public int subarraySum(int[] nums, int k) {
        int res = 0;
        int currSum = 0;

        HashMap<Integer, Integer> preSum = new HashMap<>();
        preSum.put(0, 1);

        for (int i = 0; i < nums.length; i++) {
            currSum += nums[i];
            if (preSum.containsKey(currSum - k)) {
                res += preSum.get(currSum - k);
            }

            preSum.put(currSum, preSum.getOrDefault(currSum, 0) + 1);
        }

        return res;
    }
}