恰好型滑动窗口

和相同的二元子数组

题目大意,就是求这个数组中和为k的子数组的个数

解题思路1:哈希map法

class Solution {
public:
    int numSubarraysWithSum(vector<int>& nums, int goal) {
        int n=nums.size();
        unordered_map<int,int>mp;
        int sum=0,ans=0;
        for(int i=0;i<n;i++){
            mp[sum]++;
            sum+=nums[i];
            ans+=mp[sum-goal];
        }
        return ans;
    }
};
//假设j~i这段区间的和是要求的k,求前缀和,然后看满足前缀和i-k的点有几个,这个看代码应该可以看懂

解题思路2:三指针(滑动窗口)

class Solution {
public:
    int numSubarraysWithSum(vector<int>& nums, int goal) {
        int n=nums.size();
        int sum1=0,sum2=0,left1=0,left2=0,right=0,ans=0;
        while(right<n){
            sum1+=nums[right];
            while(left1<=right&&sum1>goal){
                sum1-=nums[left1];
                left1++;
            }
            sum2+=nums[right];
            while(left2<=right&&sum2>=goal){
                sum2-=nums[left2];
                left2++;
            }
            ans+=left2-left1;
            right++;
        }
        return ans;
    }
};
//就是,求左边界可以在哪个范围,left1是最小的边界,只有在sum>goal的时候才会前移动
//left2是这个左边界可以的离原点的最远距离
//这两个点之间的距离,就是子数组的个数
//逻辑还是比较好理解的
posted @ 2026-03-11 22:03  Time_q  阅读(2)  评论(0)    收藏  举报