还是直接题干:
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。
子数组是数组中元素的连续非空序列。
示例 1:
输入:nums = [1,1,1], k = 2 输出:2
示例 2:
输入:nums = [1,2,3], k = 3 输出:2
解题思路:
首先需要具备的一个前置知识是前缀和,涉及到子串子序列的问题,通常可以通过双指针或者前缀和来解决,这题不能用双指针的原因是需要连续的非空序列,那么通过排序然后双指针靠拢的方案是行不通的,那么是否只能暴力呢,暴力的做法复杂度为O(),因此考虑前缀和。
前缀和,还是通过空间换时间的方式,通过一个数组来记录前n个元素的和是多少,那么任何一个子序列的和就可以通过数组内对应的两个元素相减来获得,这个操作的复杂度是O(1)的,而这个数组可以通过类似动态规划或者递推的方式初始化,那么复杂度就被优化到O(N)。
构建完前缀和数组之后,就为这题做好了准备,题目要求的是序列等于某个数,那么可以转化为类似两数之和的问题。为了方便查找,采用哈希map,边遍历,边构建哈希表,边保存结果。复杂度也为O(N)。具体如何实现的请看代码。
AC代码:
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int n=nums.size();
int answer = 0;
vector<int> s(n+1);
for(int i=0;i<n;i++){
s[i+1] = s[i]+nums[i];
}
unordered_map<int, int> a;
for(int x:s){
answer+= a.contains(x-k)?a[x-k]:0;
a[x]++;
}
return answer;
}
};
23

被折叠的 条评论
为什么被折叠?



