题目

给定一个二进制数组 nums , 计算其中最大连续 1 的个数。

示例 1:

输入:nums = [1,1,0,1,1,1]
输出:3
解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.

示例 2:

输入:nums = [1,0,1,1,0,1]
输出:2

提示:

1 <= nums.length <= 10^5
nums[i] 不是 0 就是 1.

思路

一个常规的解法是,每遇到一个485. 最大连续 1 的个数 - 图1就更新以当前485. 最大连续 1 的个数 - 图2结尾的最长的连续485. 最大连续 1 的个数 - 图3的长度,遇到485. 最大连续 1 的个数 - 图4了就将长度归零。

也可以套用滑窗模板,窗口右边界485. 最大连续 1 的个数 - 图5尽可能向右扩展,遇到485. 最大连续 1 的个数 - 图6时更新最大长度,然后移动左边界。

代码

常规遍历

  1. class Solution {
  2. public int findMaxConsecutiveOnes(int[] nums) {
  3. int n = nums.length;
  4. int ans = 0;
  5. int cnt = 0;
  6. for (int i = 0; i < n; i++) {
  7. if (nums[i] == 1) {
  8. cnt++;
  9. ans = Math.max(ans, cnt);
  10. } else {
  11. cnt = 0;
  12. }
  13. }
  14. return ans;
  15. }
  16. }

滑窗

  1. class Solution {
  2. public int findMaxConsecutiveOnes(int[] nums) {
  3. int n = nums.length;
  4. int left = 0;
  5. int right = 0;
  6. int ans = 0;
  7. while (right < n) {
  8. while (right < n && nums[right] == 1) {
  9. right++;
  10. }
  11. // 此时right指向连续1右边的第一个0,“刚好出界”,left指向最左边1,因此right-left刚好为连续1的长度
  12. ans = Math.max(ans, right - left);
  13. // 注意下面两句的顺序不可颠倒
  14. right++;
  15. left = right;
  16. }
  17. return ans;
  18. }
  19. }