一,最大连续1的个数三

解题思路:
这题我们通过暴力枚举,也就是将所有的数组都列出来,有零的就翻转到最多能翻转为止,但是这样的方法,会很麻烦,因为翻转的操作会导致你后一个列出的数组的0得重新翻转回去。所以好的方法就是**找到一个拥有个数最多为k且数组长度最长的一个数组,**并且你在通过这样的方式进行列举的时候,你会发现可以使用滑动窗口的思想来优化解决,思路看我的画图演示

代码演示:
java
public int longestOnes(int[] nums, int k) {
int len=0;
for (int left = 0,right=0,zero=0; right <nums.length ; right++) {
if (nums[right]==0){
zero++;
}
while (zero>k){
//移动left以及更新len
if (nums[left]==0){
zero--;
}
left++;
}
len=Math.max(len,right-left+1);
}
return len;
}
二,将x减到0的最小操作数

解题思路:
我们反向来思考,我们不是将目标元素减到0,而是我们根据左右两个指针之间的数组范围相加得到数组总数减去目标元素,跟上题的思路是类似的,那我们怎么看是不是使用这个滑动窗口呢,因为当我们看到我们的指针都是朝同一个方向前进的时候就可以省略一些不必要的回退,就会跟一个窗口一样了

代码演示:
我们滑动窗口主要的写代码模式就是进窗口,判断条件出窗口,然后更新结果,不过这个更新结果可能需要根据题目要求来
java
public int minOperations(int[] nums, int x) {
int len=0,left = 0,right=0,sum=0,ret=-1;
int sumnum = 0;
for (int i = 0; i < nums.length; i++) {
sumnum += nums[i];
}
if (sumnum-x<0){
return -1;
}
for (right=0;right<nums.length;right++){
//进窗口
sum+=nums[right];
//判断条件,看看什么时候出窗口,也就是left要移动的时候
while (sum>sumnum-x){
sum-=nums[left++];
}
if (sum==sumnum-x){
ret=Math.max(ret,right-left+1);
}
}
if (ret==-1){
return -1;
}else {
return nums.length-ret;
}
}