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:

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

 

思路:

先来看O(n2)的解:就是简单的暴力破解法,以每个位置为起点能否得到和为k的子串,因为数组里会有0和非负数出现,所以必须要遍历完。

Grandyang整理的方法中有更快的方法。

这个方法是用map来存储从0到当前的和的出现次数。

若m[sum - k] 出现过,则说明在前面某一段一定存在一段连续的数字和为k

我们来举个🌰

    [1,     2,     3,     1,     2,     3,     4] k = 3

  sum:1

     |--------| 3

     |-----------------|6

     |-------------------------|7

     |----------------------------------|9

     |------------------------------------------ |12

     |---------------------------------------------------|16

所以我们需要在开始时向map中加入{0,1}

    map[i-3]不存在

    map[3-3] = map[0] = 1 -> res + 1;

    map[6-3] = map[3] = 1 -> res + 1;

    ....

    之所以res更新的时候为 res += map[sum - k],是因为数组中可能出现负数。

这道题其实跟283.Product array有点相似

代码:

O(n2)

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int ret = 0;
        for(int i = 0; i < nums.size(); i++){
            int sum = nums[i];
            if(sum == k){
                ret++;
            }
            for(int j = i+1; j < nums.size(); j++){
                sum += nums[j];
                if(sum == k)
                    ret++;
            }
        }
        return ret;
    }
};

O(n):

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int res = 0;
        int n = nums.size();
        int sum = 0;
        unordered_map<int, int> m{{0,1}};
        for(int i = 0; i < n; i++){
            sum += nums[i];
            res += m[sum - k];
            m[sum]++;
        }
        return res;
    }
};

 

posted @ 2018-06-16 03:53  妖域大都督  阅读(95)  评论(0编辑  收藏  举报