小念子

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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

 

 

 解答:

    public int subarraySum(int[] nums, int k) {
        int ret = 0;
        int sum = 0;
        Map<Integer, Integer> map = new HashMap<Integer, Integer>(); // key:前缀和[0,i]; value:个数
        map.put(0, 1); // 初始,前缀和为0的个数是1,即一个都不选的时候(左边界)
        for (int i = 0; i < nums.length; ++i) {
            sum += nums[i];
            if (map.containsKey(sum - k)) {
                ret += map.get(sum - k);
            }
            map.put(sum, map.getOrDefault(sum, 0) + 1);
        }
        return ret;
    }

用例:

3 4 7 2 -3 1 4 2  ,k = 7

初始:map---[(0,1)],结果ret = 0,前缀和sum=0

  sum sum-k (sum-k)是否在map中存在 ret 更新map
初始       0 [(0,1)]
3 3 -4 0 [(0,1),(3,1)]
4 7 0 1 [(0,1),(3,1),(7,1)]
7 14 7 2 [(0,1),(3,1),(7,1),(14,1)]
2 16 9 2 [(0,1),(3,1),(7,1),(14,1),(16,1)]
-3 13 6 2 [(0,1),(3,1),(7,1),(14,1),(16,1),(13,1)]
1 14 7 3 [(0,1),(3,1),(7,1),(14,2),(16,1),(13,1)]
4 18 11 3 [(0,1),(3,1),(7,1),(14,2),(16,1),(13,1),(18,1)]
2 20 13 4 [(0,1),(3,1),(7,1),(14,2),(16,1),(13,1),(18,1),(20,1)]

 

 

 

 

 

 

 

 

 

 

 

因此最后结果为4

 

posted on 2021-03-02 15:13  小念子  阅读(68)  评论(0编辑  收藏  举报