侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 675 篇文章
  • 累计创建 128 个标签
  • 累计收到 29 条评论

目 录CONTENT

文章目录

【遍历】最大连续 1 的个数

GabrielxD
2022-06-11 / 0 评论 / 0 点赞 / 486 阅读 / 564 字
温馨提示:
本文最后更新于 2022-07-26,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

题目

485. 最大连续 1 的个数


给定一个二进制数组 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.

解题

方法一:遍历 找最近两个0之间的相隔位数

思路

由于二进制数组中只会出现 01 所以可以遍历数组,找出每两个最近的 0 之间相隔了多少位(不包括两边)就是某段连续 1 的个数,维护一个最大 1 个数不断更新即可。

需要注意的是:

  1. 如果数组中第一位不是 0 那么从 nums[0] 到第一个 0 出现为止,中间的连续 1 不会被记录,把数组的 -1 位也看作是一个 0 就可以解决这个问题。
  2. 如果数组中最后一位不是 0 那么从最后一个 0 出现的位置到 nums[len - 1] 为止,中间的 1 也不会被记录,在遍历完成后统计最后一段连续 1,如果有需要就更新答案就可以解决。

代码

class Solution {
    public int findMaxConsecutiveOnes(int[] nums) {
        int ans = 0;
        int prev = -1;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == 0) {
                ans = Math.max(ans, i - prev - 1);
                prev = i;
            }
        }
        return Math.max(ans, nums.length - prev - 1);
    }
}

方法二:遍历 遇0计数增加遇1计数清零

思路

按理来说这中方法应该比第一种方法要好想,但我先想出来的是第一种🤣。

就像思路标题所说,遍历数组:

  • 遇0则计数增加。
  • 遇1则更新答案并把计数清零。

需要注意的是最后一次计数可能没被算上,所以返回答案时要再拿 countans 比一次。

class Solution {
    public int findMaxConsecutiveOnes(int[] nums) {
        int ans = 0;
        int count = 0;
        for (int num : nums) {
            if (num == 1) count++;
            else {
                ans = Math.max(ans, count);
                count = 0;
            }
        }
        return Math.max(ans, count);
    }
}
0

评论区