我听得这个:
算法面试实录-和为 k 的子数组_哔哩哔哩_bilibili
pre[i]−pre[j−1]==k,前缀和求符合的差值
简单移项可得符合条件的下标 j 需要满足
pre[j−1](有几个区间满足)==pre[i]−k,key存前缀和,value存有几个得这个数的,比如上面的22-6=16,16存在且是一个,所以满足的连续的区间和区间和有一个
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map<int,int>mp;和,几种
mp[0]=1;//初始化,和为0一种
int h=0,pre=0;
for(auto x:nums){
pre+=x;
if(mp.find(pre-k)!=mp.end()) find返回key值
h+=mp[pre-k];
mp[pre]++;
} return h;}};