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)移动左窗口,直至不满足条件。移动的过程中,只要移动一次仍然满足条件,则找到了一个满足条件的窗口,更新结果。
评论前必须登录!
注册