滑动窗口解连续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
LeetCode 795 区间子数组个数[双指针 滑动窗口] HERODING的LeetCode之路