class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int n = nums.size();
int c = 0;
vector<int> vi(n+1,0);
for(int i=1;i<n+1;++i){
vi[i] = vi[i-1]+nums[i-1];
}
/*双循环超时
for(int i=0;i<n+1;++i){
for(int j=i+1;j<n+1;++j){
if(vi[j]-vi[i]==k&&i<j){
++c;
}
}
}
*/
/*负数存在,不能用滑动窗口
int st = 0;
for(int ed = st+1;ed<n+1;++ed){
while(vi[ed]-vi[st]>k){
++st;
}
if(vi[ed]-vi[st]==k&&st<ed){
++c;
}
}*/
//hash优化
unordered_map<int,int> mii;
for(int i=0;i<n+1;++i){
if(mii.find(vi[i]-k)!=mii.end()){
//注意这里是不是加1
c+=mii[vi[i]-k];
}
mii[vi[i]]++;
}
return c;
}
};
剑指 Offer II 010. 和为 k 的子数组
最新推荐文章于 2024-07-21 11:20:00 发布