【前缀和+Map】Leetcode560寻找等于K的子数组

1.题目

Given an array of integers nums and an integer k, return the total number of continuous subarrays whose sum equals to k.

Example 1:

Input: nums = [1,1,1], k = 2
Output: 2
Example 2:

Input: nums = [1,2,3], k = 3
Output: 2
 
Constraints:

1 <= nums.length <= 2 * 104
-1000 <= nums[i] <= 1000
-107 <= k <= 107

2.思路

一开始想到用前缀和,但后面寻找等于K的子数组时,采用暴力两次遍历,最后超时了。看到网上思路才知道可以用map,保存某一特定前缀和是否出现。若map值为一,表示出现了,总count值则加一,为0则表示没有,总count值不变。妙蛙。这样就可一次遍历完成。
【PS】一般函数遍历不能超过 1 0 8 10^8 108,这题两次遍历明显超了

3.origin思路

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

4.参考思路

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) 
    {
       
      vector<int> ans;  
       //ans.push_back(nums[0]);
        int sum=0; //记录前缀和
         int times=0;
        map<int,int> key;
        key[0]=1;
      for(int i=0;i<nums.size();i++)
      {
         //ans.push_back(ans[i-1]+nums[i]);   
          sum+=nums[i];
         times+=key[sum-k];
         key[sum]+=1;
         
      }
       
       return times;
        
    }
};
上一篇:leetcode560 和为K的子数组


下一篇:Spring官网阅读(一)容器及实例化