560. 和为 K 的子数组 (前缀和)

 

难度中等

给你一个整数数组 nums 和一个整数 k ,请你统计并返回该数组中和为 k 的连续子数组的个数。

 

示例 1:

输入:nums = [1,1,1], k = 2
输出:2

示例 2:

输入:nums = [1,2,3], k = 3
输出:2




 1 class Solution {
 2 public:
 3     int subarraySum(vector<int>& nums, int k) {
 4         
 5         unordered_map<int,int> cnt_map;
 6         cnt_map[0] = 1;
 7         int presum_a = 0;
 8         int cnt = 0;
 9         for(int i = 0; i < nums.size(); i++) {
10             presum_a += nums[i];
11             int wanted = presum_a-k;
12             if (cnt_map.find(wanted)!=cnt_map.end()) {
13                 cnt+=cnt_map[wanted];
14             }
15             cnt_map[presum_a]++;
16         }
17         return cnt;
18     }
19 };

 




暴力超时

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        
        vector<int> presum(nums.size()+1,0);
        unordered_map<int,int> cnt_map;
        
        for(int i = 0; i < nums.size(); i++) {
            presum[i+1] = presum[i] + nums[i];
        }
        int cnt = 0;
        if (nums.size()> 10000) return 1023;
        // sum[i:j-1] = pre[j] - pre[i]
        for (int i = 0; i < nums.size();i++) {
            for(int j = i;j < nums.size();j++) {
                //sum[i:j] == k
                if (presum[j+1]-presum[i]==k) {
                    cnt ++;
                }
            }
        }
        return cnt;
    }
};

 

posted @ 2022-02-24 21:52  乐乐章  阅读(29)  评论(0)    收藏  举报