一、题目描述
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。
子数组是数组中元素的连续非空序列。
注意:nums中的元素可为负数
输入:nums = [1,1,1], k = 2 输出:2 输入:nums = [1,2,3], k = 3 输出:2
1 <= nums.length <= 2 * 104 -1000 <= nums[i] <= 1000 -107 <= k <= 107
二、题目解答
class Solution { public: int subarraySum(vector& nums, int k) { //假设数组的前缀和为presum[i],那么对于任意两个下标i,j //如果presum[j]-presum[i] = k //那么从i+1到j的连续子数组合为 k //在遍历过程中,用哈希表存储前缀和出现的次数 //如果存在哈希表中,那么就count+出现次数 int sum = 0; int count = 0; map map_tmp; map_tmp [0] = 1; for (int i = 0; i < nums.size(); i++){ sum = sum + nums[i]; //有当前前缀和-k的前缀和 if (map_tmp.find(sum - k) != map_tmp.end()) count += map_tmp[sum - k]; //判断完毕后再加入map map_tmp[sum]++; } return count; } }
还没有评论,来说两句吧...