码迷,mamicode.com
首页 > 其他好文 > 详细

560.Subarray Sum Equals K

时间:2018-10-25 00:22:40      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:ret   之间   sub   who   i++   pad   NPU   one   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

标签:ret   之间   sub   who   i++   pad   NPU   one   output   

原文地址:https://www.cnblogs.com/ovs98/p/9846586.html

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