————————————————————————————————————
⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大三学生。
⏩最近在准备秋招,一直在练习编程。
⏩本篇文章对赛码网的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;}