1. 程式人生 > >560.Subarray Sum Equals K

560.Subarray Sum Equals K

hose color padding amp arr spa 循環 who output

Description

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

一.題目理解

給定一個數組,找出其中連續子序列之和為K的子序列個數。

二.題目解答

首先我們想到的是打表求出累加數組,然後再去遍歷求解,這種做法很簡答,但是很耗時,代碼如下

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        vector<int> sums = nums;
        int cur = 0;


        //打表
        for(int i = 1; i < nums.size(); i++)
            sums[i] 
= sums[i - 1] + nums[i]; //查找 cur = 0; for(int i = 0; i < nums.size(); i++) { if(sums[i] == k) cur++; for(int j = i - 1; j >= 0; j--) { if(sums[i] - sums[j] == k) cur++; } }
return cur; } };

上述代碼用了兩重循環,因而是很耗時的,我們考慮能否降低循環次數?

想了半天沒想到,找到網上一種無序表的方法,無序表建立在連續數組之和與其出現次數之間的映射上。

下圖是我的解釋

技術分享圖片

代碼如下:

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {

       int cur = 0;
       unordered_map<int,int> umap{{0,1}};

       int sum = 0;
       for(int i = 0;i < nums.size();i++){
        sum += nums[i];

        cur += umap[sum - k];
        ++umap[sum];
       }

        return cur;
    }
};

560.Subarray Sum Equals K