返回
力扣 1004. 最大连续 1 的个数 III - 满足条件的 C 语言实现
见解分享
2023-11-01 00:53:28
最近,我在刷力扣的题海时遇到了一个颇具挑战性的题目——力扣 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。