————————————————————————————————————
⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大三学生。
⏩最近在准备秋招,一直在练习编程。
⏩本篇文章对赛码网的01串的魔法 题目做一个详解。
⏩感谢你的阅读,不对的地方欢迎指正。
————————————————————————————————————
题目:
思路解析:
问题要求找到连续数字1的最长长度,其中可以通过最多K次将0替换为1。我们可以使用滑动窗口的方法来解决。
- 定义两个指针
left
和right
,初始时都指向数组的起始位置。 - 初始化变量
change
和maxLen
为0,用于记录替换的次数和最长连续1的长度。 - 通过移动
right
指针来扩展窗口,每遇到一个1,将count
加1。 - 如果遇到0,分两种情况处理:
- 如果
change
小于K,表示还有机会将0替换为1,此时将change
加1,count
加1。 - 如果
change
已经等于K,表示没有机会再替换0了,此时需要移动left
指针来缩小窗口,直到窗口内的0减少到K以内。
- 如果
- 每次移动窗口后,将
count
与maxLen
比较,更新maxLen
的值。 - 重复步骤3到步骤5,直到
right
指针达到数组的末尾。 - 返回
maxLen
作为结果。
代码如下:
#include <stdio.h>
int MaxLen(int *nums,int length,int k)
{
int left = 0;
int right = 0;
int change = 0;
int maxlen = 0;
int count = 0;
while(right < length){
if(nums[right] == 1){
count ++;
}
else {
if(change < k){
change ++;
}
else {
while(nums[left] != 0){
left++;
count --;
}
left ++;
count--;
}
count ++;
}
if(count > maxlen){
maxlen = count;
}
right++;
}
return maxlen;
}
int main()
{
int n,k,arr[300005];
scanf("%d %d",&n,&k);
for(int i = 0;i < n;i ++){
scanf("%d",&arr[i]);
}
printf("%d",MaxLen(arr,n,k));
return 0;
}