码迷,mamicode.com
首页 > 其他好文 > 详细

560. Subarray Sum Equals K - Medium

时间:2018-12-02 12:18:28      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:问题   col   detail   就是   sub   更新   hose   相同   时间   

Given an array of integers and an integer k, you need to find the total number of continuous subarrays whose sum equals to k.

Example 1:

Input:nums = [1,1,1], k = 2
Output: 2

 

Note:

  1. The length of the array is in range [1, 20,000].
  2. The range of numbers in the array is [-1000, 1000] and the range of the integer k is [-1e7, 1e7].

 

解法:hashmap + prefix sum (cummulative sum)

 

prefix sum:

prefixsum[x] = sum of subarray(0, x) = nums[0] + ... + nums[x] = prefixsum[x-1] + nums[x]

e.g. index      0  1  2

  nums      [1, 1, 1]

  prefix sum [0, 1, 2, 3]    sum of subarray(i, j) = prefixsum[j] - prefixsum[i-1]

用了prefix sum,问题就转化为 j > i时,求有多少对<i, j>满足 prefixsum[j] - prefixsum[i-1] = k -> prefixsum[j]  - k = prefixsum[i-1]

 

detail:

用hashmap存 连续子数组之和(sum = nums[0] + ... + nums[i]) 及其出现次数,以便查找sum-k出现的次数(有多少prefix sums等于sum - k,nums[0] + ... + nums[j] = sum - k,就有相同数目的prefix sums,nums[j+1] + ... + nums[i] = k)。

遍历nums中元素,累加当前元素更新sum,在map中查找key=sum-k出现的次数(即,在遍历过的数组元素中,prefixsum[i-1] = prefixsum[j]  - k 出现的次数),然后更新当前prefixsum在map中的次数。

注意:map初始化,map.put(0, 1)!即当sum刚好等于k的时候,从数组下标为0到当前位置这一子数组的和就是k,也符合题意。

时间:O(N),空间:O(N)

class Solution {
    public int subarraySum(int[] nums, int k) {
        HashMap<Integer, Integer> map = new HashMap<>();
        int sum = 0, res = 0;
        map.put(0, 1);
        for(int i = 0; i < nums.length; i++) {
            sum += nums[i];
            res += map.getOrDefault(sum - k, 0);
            map.put(sum, map.getOrDefault(sum, 0) + 1);
        }
        return res;
    }
}

 

560. Subarray Sum Equals K - Medium

标签:问题   col   detail   就是   sub   更新   hose   相同   时间   

原文地址:https://www.cnblogs.com/fatttcat/p/10052251.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!