滑动窗口解连续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;
}

おすすめ

転載: blog.csdn.net/m0_46672781/article/details/119239394