- 👑专栏内容:力扣刷题
- ⛪个人主页:子夜的星的主页
- 💕座右铭:前路未远,步履不停
目录
- 一、题目描述
- 二、题目分析
- 1、最值模拟
- 2、双指针
一、题目描述
题目链接:最大连续 1 的个数
给定一个二进制数组 nums
, 计算其中最大连续 1 的个数。
二、题目分析
1、最值模拟
通过遍历数组并维护count
和maxCount
这两个变量来解决。其中,count
用于记录当前连续1的个数,maxCount
则用于记录遍历过程中出现的最大连续1的个数。循环遍历数组种的每一个值,如果是连续的1就让count
自增 ,当遇见0后,就让count
和maxCount
进行比较,将较大的值给maxCount
。
class Solution {public int findMaxConsecutiveOnes(int[] nums) {int maxCount = 0; int count = 0; //(1)for(int i = 0; i < nums.length; i++){ //(2)if(nums[i] == 1){ count++; // (3)}else{maxCount = Math.max(count,maxCount); //(4)count = 0; //(5)}}maxCount = Math.max(count,maxCount); //(6)return maxCount;}
}
(1)初始化计数器count
和maxCount
(2)循环遍历该数组
(3)如果一直是连续的1,count
自增
(4)遇见0了,就将count
和maxCount
进行比较,将较大的值赋给maxCount
(5)更新计数器count
(6)遍历完后还需要将count
和maxCount
进行比较,因为万一数组最后全是1,就没办法进入else 里面的语句,导致count
和maxCount
缺少比较。
2、双指针
我们只需要关注连续1的个数,而不需要连续1的位置信息。因此,我们可以通过维护两个指针来表示一个滑动窗口,窗口中的元素都是连续的1,而窗口的大小则由左右指针之间的距离表示。当遇到0时,我们通过更新左右指针来移动滑动窗口,找到下一个连续1的序列。
class Solution {public int findMaxConsecutiveOnes(int[] nums) {int left = 0; //(1)int right = 0; //(2)int maxCount = 0; //(3)while (right < nums.length) {if (nums[right] == 0) { maxCount = Math.max(maxCount, right - left);//(4)left = right + 1; //(5)}right++; // (6)} maxCount = Math.max(maxCount, right - left); //(7)return maxCount;}
}
(1)左指针,指向连续1序列的起始位置
(2)右指针,用于遍历数组
(3)maxCount
用于记录最大连续1个数
(4)当遇到0时,当前连续1序列结束,将当前长度与maxCount
进行比较取较大值
(5)移动左指针到下一个连续1序列的起始位置
(6)右指针向右移动
(7)遍历完后还需要将count
和maxCount
进行比较,因为万一数组最后全是1,就没办法进入else 里面的语句,导致count
和maxCount
缺少比较。