赛码网-01串的魔法(dp) 100%AC代码(C)

————————————————————————————————————
⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大三学生。
⏩最近在准备秋招,一直在练习编程。
⏩本篇文章对赛码网的01串的魔法 题目做一个详解。
⏩感谢你的阅读,不对的地方欢迎指正。
————————————————————————————————————
题目:
赛码网-01串的魔法(dp) 100%AC代码(C)_第1张图片
思路解析:
问题要求找到连续数字1的最长长度,其中可以通过最多K次将0替换为1。我们可以使用滑动窗口的方法来解决。

  1. 定义两个指针leftright,初始时都指向数组的起始位置。
  2. 初始化变量changemaxLen为0,用于记录替换的次数和最长连续1的长度。
  3. 通过移动right指针来扩展窗口,每遇到一个1,将count加1。
  4. 如果遇到0,分两种情况处理:
    • 如果change小于K,表示还有机会将0替换为1,此时将change加1,count加1。
    • 如果change已经等于K,表示没有机会再替换0了,此时需要移动left指针来缩小窗口,直到窗口内的0减少到K以内。
  5. 每次移动窗口后,将countmaxLen比较,更新maxLen的值。
  6. 重复步骤3到步骤5,直到right指针达到数组的末尾。
  7. 返回maxLen作为结果。

代码如下:

#include 
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;
 }

你可能感兴趣的:(刷题记录,c语言,开发语言)