这是滑动窗口思想,因逻辑上右边界随遍历自动右移,遇0时左边界跳至当前位右侧等价清空窗口,currentCount始终表示以当前位置结尾的窗口大小。

可以直接用一次遍历模拟滑动窗口,不需要真正维护左右边界,只需记录当前连续 1 的长度,并在遇到 0 时重置计数器。
核心思路:用单变量模拟窗口扩张与收缩
滑动窗口在此题中可简化为“遇 1 就扩、遇 0 就清”。因为只关心连续 1 的长度,不涉及子数组内容判断,所以无需双指针;用一个 currentCount 记录当前连续 1 的个数,用 maxCount 保存历史最大值即可。
- 遍历数组,每遇到 1,currentCount++
- 每遇到 0,更新 maxCount = Math.max(maxCount, currentCount),再将 currentCount 置为 0
- 遍历结束后,再比较一次 maxCount 和末尾的 currentCount(防止数组以 1 结尾而漏更新)
代码实现(简洁版)
public int findMaxConsecutiveOnes(int[] nums) {
int maxCount = 0, currentCount = 0;
for (int num : nums) {
if (num == 1) {
currentCount++;
} else {
maxCount = Math.max(maxCount, currentCount);
currentCount = 0;
}
}
return Math.max(maxCount, currentCount);
}
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
为什么这算滑动窗口思想?
虽然没写 left/right 指针,但逻辑上:
立即学习“Java免费学习笔记(深入)”;
- 窗口右边界 随遍历下标自动右移
- 窗口左边界 在遇到 0 时被“跳过”——等价于 left = right + 1,即清空窗口重新开始
- 窗口大小 就是 currentCount,始终代表以当前位置结尾的最长连续 1 子数组长度
边界情况处理说明
数组全 0 → currentCount 始终为 0,maxCount 保持 0,返回 0
数组全 1 → never hit else branch,最后 return Math.max(0, currentCount) 即返回总长
空数组 → for 循环不执行,直接返回 Math.max(0, 0) = 0(前提是 nums 非 null;若需健壮性,应先判空)

















