485. 最大连续1的个数(一次遍历数组和滑动窗口:双指针)

17 篇文章 0 订阅
15 篇文章 0 订阅

最大连续1的个数

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

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

解题思路

方法一:一次遍历数组
定义一个 maxCount 用来记录当前数组中最大连续 1 的个数。
遍历时在没有遇到 0 时 count 值加 1。当遇到0时,先看当前 count 值是否是当前数组中最大连续 1 的个数再令 count = 0,重新开始计数,重复此过程直到数组末尾。最后还要再一次判断 count 和 maxCount 的大小。因为,若nums = {1},若没有判断最后的maxCount值为 0,与答案不符合。

代码

class Solution {

    public int findMaxConsecutiveOnes(int[] nums) {

        int n = nums.length;
        int count = 0;
        int maxCount = 0;

        for (int i=0;i<n;i++) {

        	if (nums[i] == 1) {

            	count++;
    		} else {

            	maxCount = Math.max(maxCount, count);
                count = 0;
            }
        }
        maxCount = Math.max(maxCount, count);
    	return maxCount;
    }
}

时间复杂度:只遍历了一次数组且数组的长度为n,复杂度为O(n)
空间复杂度:没有额外开辟新的空间,复杂度为O(1)


方法二:双指针(滑动窗口)
双指针:left 指针和 right 指针,同时指向数组开头。、

  • 若当前值为 1,则令 right 指针右移。
  • 若当前值为 0,则比较窗口大小 right - left(因为值为 0 的元素不需要,所以应该是去掉 0 元素的窗口大小),并使 right 指针右移,同时 left 指针右移指向当前 right 指针所指向的位置。

最后还要再一次判断 count 和 maxCount 的大小。因为,若nums = {1},若没有判断最后的maxCount值为 0,与答案不符合。

代码

class Solution {

    public int findMaxConsecutiveOnes(int[] nums) {

        int n = nums.length;
        int left = 0, right = 0;
        int maxCount = 0;

        while (right < n) {

            if (nums[right] == 1) {

                right++;
            } else {

                maxCount = Math.max(maxCount, right - left);
                right++;
                left = right;
            }
        }
        maxCount = Math.max(maxCount, right - left);
        return maxCount;
    }
}

时间复杂度:因为遍历数组的长度为n,复杂度为O(n)
空间复杂度:没有开辟新的空间,复杂度为O(1)


两种方法比较来看,滑动窗口要比一次遍历数组要更快(因为,滑动窗口中不需要用 count 来对遇到 0 时当前的子区间中的元素 1 的个数来计数,所以更快了)!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值