485. 最大连续1的个数

题目

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

只包含0和1

常规思路

一般想到的是都是遍历数组,用一个变量记录当前连续1的个数,另一个变量记录最大的长度,每当出现0就比较这两个变量直到最后完成。

但是这个题目我们可以用滑窗法来做

滑窗法

滑动窗口法,可以用来解决一些查找满足一定条件的连续区间的性质等的问题,由于区间连续,因此当区间变化时,可以通过旧有的计算结果对搜索控件进行剪枝,这样就减少了重复计算,降低了时间复杂度

将两个指针范围内的比作一个窗口,通过移动指针来改变窗口大小,观察窗口中的元素是否符合题意

此题具体思路

首先定义left和right左右两个指针,初始为0

定义max记录最大连续1的个数,初始为0

然后当右指针没有到末尾时一直循环

在循环内

遇到1,right加一右移,扩大窗口

遇到0,比较窗口的长度和max的大小,如果max小于窗口长度,更新max,左指针移动到当前右指针+1的位置

最后跳出循环时因为最后一次没有比较,所以max和窗口长度还要再比一次

代码
class Solution {
    public int findMaxConsecutiveOnes(int[] nums) {
        int left = 0;
        int right = 0;
        int max = 0;
        
        while(right < nums.length){
            //当窗口中所有元素为 1 时,右指针向右移,扩大窗口。
            if (nums[right++] == 0){
                //当窗口中存在 0 时,计算连续序列长度,左指针指向右指针。
                max= Math.max(max, right - left - 1);
                left = right;
            }
        }
        return max>right-left?max:right-left;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值