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