题目
给定一个二进制数组, 计算其中最大连续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;
}
}