题目链接:
题目描述:

题目示例:

当前元素(numsp[right])进入窗口
进行判断,如果这个数是1就无视,如果是0就让计数器zero++
判断zero>k,如果成立,就让nums[left]滑出窗口,并让计数器zero--,直到zero合法为止
程序到这里,说明窗口内元素是符合要求的,更新结果
class Solution {
public:
int longestOnes(vector<int>& nums, int k)
{
int zero=0,n=nums.size(),ret=0;
for(int left=0,right=0;right<n;right++)
{
if(nums[right]==0) zero++;
while(zero>k)
if(nums[left++]==0) zero--;
ret=max(ret,right-left+1);
}
return ret;
}
};博主笔记(字迹有点丑,请大家见谅):

题目链接:
题目描述:

题目示例:

题目要求在数组的左端或者右端进行删除数据,此时就隐含了左右两端是连续的区间,所以中间也就是连续的区间,连续的区间就可以联想到用滑动窗口来解决
首先进窗口,并计算tmp的值,tmp+=nums[right]
然后进行判断,tmp>target,成立就让左指针滑出窗口,区间和减去做指针的值
当tmp==target,说明此时找到连续的区间并且区间和为sum-x,更新结果
当遍历结束,判断是否找到了连续的区间并且区间和为sum-x,若没有找到,就返回-1,找到了就返回nums.size()-ret
class Solution {
public:
int minOperations(vector<int>& nums, int x)
{
int sum=0;
for(int i:nums) sum+=i;
int target=sum-x;
if(target<0) return -1;
int ret=-1;
for(int left=0,right=0,tmp=0;right<nums.size();right++)
{
tmp+=nums[right];//进窗口
while(tmp>target)//判断
tmp-=nums[left++];//出窗口
if(tmp==target)
ret=max(ret,right-left+1);//更新结果
}
if(ret==-1) return ret;
else return nums.size()-ret;
}
};博主笔记(字迹有点丑,请大家见谅):

往期回顾: