leetcode算法485. 最大连续 1 的个数

123 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情

一、题目描述:

485. 最大连续 1 的个数 - 力扣(LeetCode)

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

二、思路分析:

分别设置两个计数变量,finalCount用于存储数组中最大连续1的数量,tmpCount用于记录数组中各部分连续1的数量。通过遍历数组,不断动态更新二者的值来获得最终结果。
遍历数组,当发生数组中1不连续的情况时,需要检查并更新上述两个变量的值,具体包含如下两种情况:

  • 若finalCount小于tmpCount,则需要将tmpCount赋给finalCount并将tmpCount置0。
  • 若finalCount大于等于tmpCount,则仅将tmpCount置0即可。

另外,考虑到全1数组这种特殊情况。在当前遍历的元素为1时,除了要将tmpCount加1外,还要判断tmpCount是否大于finalCount,若大于则需要更新finalCount,防止元素全为1时finalCount没有得到及时更新。虽然代码运行通过但此处明显存在冗余判断,可进行进一步的优化。
再者,如提示所述,输入的数组只有0和1两个值,这意味着本题不需要显式地使用两个计数变量也能够得到最终结果。

三、AC 代码:

int findMaxConsecutiveOnes(int* nums, int numsSize){
    int maxValue = 0;
    int left = 0;
    int right = 0;
    while (right < numsSize) {
        int curValue = nums[right]; // 保存right值
        right++; // 右移下一个位置, 此处自增用于后续计算窗口[left, right)大小right - left

        if (curValue == 0) { // 若当前位置元素值为0, 则窗口left移到right为0的下一个位置,即right++之后
            left = right;
        }
        maxValue = fmax(maxValue, right - left);
    }
    return maxValue;
}

范文参考:

双指针,i,j, i指向第一个0,j指向下一个0,计算法i+1到j-1的数组和。求最大和。 - 最大连续 1 的个数 - 力扣(LeetCode)