码迷,mamicode.com
首页 > 编程语言 > 详细

LeetCode 560. Subarray Sum Equals K (子数组之和等于K)

时间:2017-10-05 00:51:33      阅读:416      评论:0      收藏:0      [点我收藏+]

标签:blank   return   targe   负数   beat   input   style   ons   amp   

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].

 

 


题目标签:Array, Map

  题目给了我们一个nums array 和一个 k, 要我们找出有多少个子数组 之和是等于 k的。

  一开始想到的是暴力解法,虽然能够通过,但是n*n 始终是太慢。

  这题可以利用HashMap,把出现过的sum 当作key 存入, 把这个sum 出现过的次数 当作value 存入。

  遍历nums array,一直更新sum,然后去map 里找有没有 sum - k,有的话说明 sum - k 是一个旧的sum,之前出现过。换句话说,新的sum - 旧的sum = k,说明 新的sum 减去 旧的sum,剩下的那一段的 和 等于k, 找到了一个子数组之和 = k的。然后在把新的sum 存入 map里。

  这题的关键就是,当我们知道了一个 sum(0,i) 和 sum(0,j)的话,我们也就知道了 sum(i+1, j)。

  所以当我们知道了目前所有旧的sum, 当我们有了一个新的sum,我们可以利用map 去找到 新的sum - k 是不是在map里存在。一旦存在,说明了我们找到了一个 子数组它的和为k。

  要注意的是,这里count +的是map 里的value,而不是count++, 因为当你在map 里找到了一个 sum - k的旧sum的时候,这个旧的sum 可能出现过2次,换句话说,可能有两个长度不一样的子数组,但是它们的和都等于 sum - k(因为有负数)。所以这里要加上旧sum 的出现次数2,因为你找到了两个不同的子数组它们的和都为k。

 

 

Java Solution:

Runtime beats 67.25% 

完成日期:10/03/2017

关键词:Array, HashMap

关键点:把所有出现过的sum存入map:sum为key,出现的次数为value;利用map来找k (新sum - k =? 任何旧sum)  

 1 class Solution 
 2 {
 3     public int subarraySum(int[] nums, int k) 
 4     {
 5         int count = 0;
 6         int sum = 0;
 7         
 8         Map<Integer, Integer> map = new HashMap<>();
 9         map.put(0, 1); // initial value sum = 0, occurrence = 1 for case sum = k, k - k = 0 counts
10         
11         for(int i=0; i<nums.length; i++) // iterate nums array
12         {
13             sum += nums[i]; // update sum
14             
15             if(map.containsKey(sum - k)) // if map has sum - k, meaning this new sum - old sum = k
16                 count += map.get(sum - k); // previous sum might appear more than once
17                                            // this is why we need to add its value
18             map.put(sum, map.getOrDefault(sum, 0) + 1); // save new sum into map
19         }
20         
21         return count;
22     }
23 }

参考资料:

https://discuss.leetcode.com/topic/87850/java-solution-presum-hashmap

 

LeetCode 题目列表 - LeetCode Questions List

 

LeetCode 560. Subarray Sum Equals K (子数组之和等于K)

标签:blank   return   targe   负数   beat   input   style   ons   amp   

原文地址:http://www.cnblogs.com/jimmycheng/p/7628102.html

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