zoukankan      html  css  js  c++  java
  • [leetcode-560-Subarray Sum Equals 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:
    The length of the array is in range [1, 20,000].
    The range of numbers in the array is [-1000, 1000] and the range of the integer k is [-1e7, 1e7].

    思路:

    感觉这个跟已知数组,求数组区间和那个很类似,[leetcode-303-Range Sum Query - Immutable]

    这个是:已知区间和为k,求一共有多少个区间的和为k。

    可以通过累积和数组sums来统计数组nums当前元素nums[i]之前所有元素的和,

    比如:k= 3

    nums: [1, -1, 5, -2, 3], 则得到

    sums: [1, 0, 5, 3, 6]

    我们可以看到累积和sums的第四个数字为3,则说明前四个数字就是符合题意的一个子数组,再来看第二个例子:

    nums: [-2, -1, 2, 1], k = 1

    sums: [-2, -3, -1, 0]

    可以在nums里找到 -1,2 的和为1,又nums[0]+nums[1]+nums[2] = sums[0]+ nums[1]+nums[2] =  sums[2] 。

    则sums[0]+k = sums[2] ,区间和k = sums[2] - sums[0] = (-1) - (-2),

    sums[2] - k =sums[0],说明存在区间nums[1],nums[2]的和为k。

    然后,再用一个哈希表来建立累积和 与 其坐标之间的映射。如果 H[ sum[i] - k ]>0 则说明存在区间和为k。

    int subarraySum(vector<int>& nums, int k)
      {
          int n = nums.size();
          vector<int >sum(n+1);//记录累加和
          for(int i =1;i<=n;i++)
          {
              sum[i] = sum[i-1]+nums[i-1];
          }
          map<int ,int > H;
          H[0] = 1;
          int ret = 0;
          for(int i =1;i<=n;i++)
          {
               ret += H[ sum[i] - k ];
               H[sum[i]]++;
          }
          return ret;
    }

    参考:

    http://www.cnblogs.com/grandyang/p/5336668.html

  • 相关阅读:
    Codeforces
    (水题)Codeforces
    【拓展欧几里得】方程的解
    洛谷P3216 [HNOI2011]数学作业
    洛谷P1719 最大加权矩形
    洛谷P1369 矩形
    洛谷 P1236 算24点
    洛谷P2014 选课
    洛谷 P1573 栈的操作
    洛谷P1531 I Hate It
  • 原文地址:https://www.cnblogs.com/hellowooorld/p/6789307.html
Copyright © 2011-2022 走看看