云计算百科
云计算领域专业知识百科平台

滑动窗口模板

209. 长度最小的子数组 – 力扣(LeetCode)

class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int left=0,right=0,sum=0,length=INT_MAX;
while(right<nums.size())
{
while(right<nums.size()&&sum<target)
{
sum+=nums[right];
right++;
}
if(sum>target)
length=min(length,right-left);
while(sum>=target)
{
length=min(length,right-left);
sum-=nums[left];
left++;
}
}
return length==INT_MAX?0:length;
}
};

2302. 统计得分小于 K 的子数组数目 – 力扣(LeetCode)

class Solution {
public:
long long countSubarrays(vector<int>& nums, long long k) {
long long res = 0, cnt = 0;
int n = nums.size(), left = 0, right = 0;
while (right < n)
{
while (right < n && cnt < k)
{
if (right > left)
cnt /= right – left;
cnt += nums[right];
cnt *= right – left + 1;
right++;
}
if (cnt >= k)res += n – right + 1;
while (cnt >= k)
{
if (right > left)
cnt /= right – left;
cnt -= nums[left];
cnt *= right – left – 1;
left++;
if(cnt>=k)
res += n – right + 1;
}
}
return (long long)n*(n+1)/2-res;
}
};

 (1)设置滑动窗口左右窗口初始值均为0,然后右区间开始移动,直至找到满足条件的区间或来到数组末尾。

(2)如果当前区间符合条件,则添加到结果中。对于2302来说,当前区间满足,则后面的区间一定都满足,更新结果。

(3)移动左窗口,直至不满足条件。移动的过程中,只要移动一次仍然满足条件,则找到了一个满足条件的窗口,更新结果。

赞(0)
未经允许不得转载:网硕互联帮助中心 » 滑动窗口模板
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!