Leetcode之560-和为K的子数组(Subarray Sum Equals K)

前言

个人网站

公众号: 北京程序猿, 网站 : https://yaml.vip

算法题

题干

给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数

示例

输入: nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。

说明

1. 数组的长度为 [1, 20,000]。
2. 数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。

解法

  1. 暴力破解
  2. 与两数之和类似,通过HashMap存储中间sum值。和为k=新的sum-旧的sum,sum是通过for循环累加得到的,要想得到旧的sum值,需要通过某种方式(采用HashMap)将sum值存储下来。

Java代码

public int subarraySum(int[] nums, int k) {
        final int LENGTH = nums.length;
        Map<Integer, Integer> sumCount = new HashMap<>(16);
        sumCount.put(0, 1);
        int sum = 0;
        int count = 0;
        for (int i = 0; i < LENGTH; i++) {
            sum += nums[i];
            if (sumCount.containsKey(sum - k)) {
                count += sumCount.get(sum - k);
            }
            sumCount.put(sum, sumCount.getOrDefault(sum, 0) + 1);
        }
        return count;
}

代码解析

  1. 第4行代码初始化HashMap。
  2. 第9-11行是这个算法题的重点,当数组指针循环到i时,此时0-i所有元素的和为sum,如果我们此时找和为k的子数组,就相当于找和为sum-k的子数组,sum-k的子数组有多少个,和为k的子数组就有多少个。

思考题

  1. 第四行代码, 为什么要初始化HashMap?

本文著作权归作者所有。

商业转载请联系作者获得授权,非商业转载请于文首标明作者姓名,保持文章完整性,并附上出处和文章链接!未按规范转载者,作者保留追究相应责任的权利!

作者:北京程序猿

链接:https://yaml.vip/2019/03/17/Leetcode%E4%B9%8B560-%E5%92%8C%E4%B8%BAK%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84/

    原文作者:北京程序猿
    原文地址: https://www.jianshu.com/p/d93550d4e8c9
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞