zoukankan      html  css  js  c++  java
  • LeetCode 560. Subarray Sum Equals K (子数组之和等于K)

    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

  • 相关阅读:
    LightOJ 1422 Halloween Costumes(区间dp)
    zoj 3537 Cake(区间dp)
    POJ 2955 Brackets(区间dp)
    HDU 1058 Humble Numbers(dp)
    uva 10934 Dropping water balloons(转载)
    树形dp
    Manacher算法求回文半径
    poj-1236.network of schools(强连通分量 + 图的入度出度)
    hdu-2255.奔小康赚大钱(最大权二分匹配)
    poj-2289.jamies contact groups(二分答案 + 二分多重匹配)
  • 原文地址:https://www.cnblogs.com/jimmycheng/p/7628102.html
Copyright © 2011-2022 走看看