滑动窗口解连续1的个数

Posted 勇敢*牛牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了滑动窗口解连续1的个数相关的知识,希望对你有一定的参考价值。

给定一个由若干0和1组成的数组A,我们最多可以将K个值从0变成1。 返回仅包含1的最长(连续)子数组的长度。

示例1:
输入: A=[1,1,1,0,0,0,1,1,1,1,0],K=2
输出:6
解释:
[1,1,1,0,0,1,1,1,1,1,1] 粗体数字从0翻转到1,最长的子数组长度为6。

示例 2:
输入: A=[0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K=3
输出:10
解释: [0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1] 粗体数字从0翻转到1,最长的子数组长度为10。

解题思路:
我们可以使用两个指针,一个指向窗口的左边,一个指向窗口的右边,每次遍历数组的时 候窗口左边的指针先不动,窗口右边的指针始终都会往右移动,然后同时统计窗口内0的 个数,如果0的个数大于K的时候,我们也不能把窗口内的所有数字都变为1,这个时候我们在移动窗口左边的指针,直到窗口内0的个数不大于K为止…,

/***********************************************************
*版权所有:(C) 2021.7.30  烽火编程(第八方面军) 
* 
*文件名称:滑动窗口解连续1的个数 
*内容摘要:滑动窗口最大值 
*当前版本:1-1 
*文件作者:帅子牛 
*完成日期:2021.7.30
*
*修改记录:暂无 
***********************************************************/ 
#include <stdio.h>
#define N 8			
int fun(int A[],int length,int K){
	int left=0,right=0;		//定义左窗口和右窗口
	int max=0; 				//定义窗口总和最大值
	int zerocount=0;		//计数0的个数
	for(right=0;right<length;right++){		//length作为下标的范围 
		if(A[right] == 0){					//计算0的个数 
			zerocount++;
		}
		while(zerocount>K){					//当零的个数超过K时 缩小窗口 
			if(A[left++] == 0){
				zerocount--;
			}
		}
		max = max>(right-left+1)?max:(right-left+1);
	}
	return max;
} 
int main() {
	int A[] = {1,1,1,0,0,0,1,1,1,1,0};
	int K=2;
	int length = sizeof(A)/sizeof(int);//计算数组的长度 
	
	printf("%d\\n",length);
	printf("%d",fun(A,length,K));
	return 0;
}

以上是关于滑动窗口解连续1的个数的主要内容,如果未能解决你的问题,请参考以下文章

滑动窗口7:Leetcode 1004. 最大连续1的个数 III

滑动窗口解乘积小于K的子数组

LeetCode 795 区间子数组个数[双指针 滑动窗口] HERODING的LeetCode之路

华为OD机试题,用 Java 解滑动窗口最大和问题

LeetCode 2024 考试的最大困扰度[滑动窗口] HERODING的LeetCode之路

滑动窗口