返回

力扣 1004. 最大连续 1 的个数 III - 满足条件的 C 语言实现

见解分享

最近,我在刷力扣的题海时遇到了一个颇具挑战性的题目——力扣 1004:最大连续 1 的个数 III。这道题要求找出给定数组中满足特定条件的最大连续 1 的个数。具体来说,条件是允许在连续 1 中最多包含 K 个 0。

对于这道题,我的第一反应是使用滑动窗口的技巧。滑动窗口是一种常见的算法设计模式,特别适用于处理连续子数组问题。在我们的场景中,我们可以使用一个左指针和一个右指针来定义一个滑动窗口,并遍历数组以找到满足条件的最长连续 1。

下面是我实现的 C 语言代码:

#include <stdio.h>
#include <stdlib.h>

int maxConsecutiveOnes(int* nums, int numsSize, int k) {
    // 初始化滑动窗口的左右指针和最大长度
    int left = 0, right = 0, maxLength = 0;
    // 统计滑动窗口中 0 的个数
    int zeroCount = 0;

    while (right < numsSize) {
        // 如果当前元素为 0,增加 0 的计数
        if (nums[right] == 0) {
            zeroCount++;
        }

        // 如果 0 的个数超过 k,移动左指针直到 0 的个数不超过 k
        while (zeroCount > k) {
            if (nums[left] == 0) {
                zeroCount--;
            }
            left++;
        }

        // 更新最大长度
        maxLength = fmax(maxLength, right - left + 1);

        // 移动右指针
        right++;
    }

    return maxLength;
}

在代码中,我首先初始化了滑动窗口的左右指针和最大长度。然后,我使用了一个 while 循环来遍历数组。对于每个元素,我都会检查它是否是 0,如果是,我就会增加 0 的计数。

如果 0 的计数超过 k,我就会移动左指针直到 0 的计数不超过 k。我使用了一个 while 循环来执行此操作,并在每次循环中检查当前元素是否是 0。如果是,我就会减少 0 的计数并移动左指针。

一旦 0 的计数不超过 k,我就会更新最大长度。我通过比较当前最大长度和窗口中 1 的个数(即 right - left + 1)来做到这一点。

最后,我返回最大长度。

这是一个简洁高效的 C 语言实现,它利用滑动窗口技巧解决了最大连续 1 的个数 III 问题。它遍历数组,统计窗口中 0 的个数,并根据需要移动窗口,以找到最长的连续 1。