这是滑动窗口思想,因逻辑上右边界随遍历自动右移,遇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);
}
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
为什么这算滑动窗口思想?
虽然没写 left/right 指针,但逻辑上:
- 窗口右边界 随遍历下标自动右移
- 窗口左边界 在遇到 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;若需健壮性,应先判空)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










