其他分享
首页 > 其他分享> > 560. 和为 K 的子数组 (前缀和)

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;
    }
};

 

标签:map,cnt,前缀,nums,560,int,数组,presum,size
来源: https://www.cnblogs.com/zle1992/p/15933738.html