LeetCode——1004.最大连续1的个数

116 阅读2分钟

最大连续1的个数

1.题目链接

1004. 最大连续1的个数 III

2.原题描述:

给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k0 ,则返回 数组中连续 1 的最大个数

3.相关算法

滑动窗口:使用滑动窗口维护一个区间,使得区间内的 0 的数量不超过 k。具体地,右端点不断向右移动,如果遇到了 0,那么就尝试将左端点右移,直到区间内的 0 的数量不超过 k。在每次移动右端点时,都需要更新最大连续 1 的个数。

4.本题主要思路

本题主要是要将问题转化,题目求是可以翻转k个0,那么我们就可以转化成可以允许最多有k个0在该连续的区间内,那么可以使用滑动窗口维护一个区间,使得区间内的 0 的数量不超过 k。当该区间的0超过相对应的数量时,滑动窗口往后移动,并且判断最左边的是否是0,如果是0,那么zerocount-1。继续按照前面的方式继续,直到右端到达数组的尾部。

5.源码分析

class Solution {
    public int longestOnes(int[] nums, int k) {
        int left = 0, right = 0, zeroCount = 0, maxCount = 0;	// 1
        while (right < nums.length) {							
            if (nums[right] == 0) {				// 2
                zeroCount++;
            }
            while (zeroCount > k) {								
                if (nums[left] == 0) {				// 3
                    zeroCount--;
                }
                left++;											
            }
            maxCount = Math.max(maxCount, right - left + 1);	// 4
            right++;						// 5
        }
        return maxCount;					// 6
    }
}
  1. 创建并初始化左右边界的变量,以及该区间内0的个数的计数器,还有最大连续的数量;
  2. 滑动窗口往前滑动,判断该位置的数是否为0,若为0则zerocount++;
  3. 当0的数量大于要求的数量,滑动窗口的左端往前移动并判断最左端位置的数是否为0,若为零zerocount-1;
  4. 判断此时区间的区间值是否为最大,若大于原来的最大值则将其替换
  5. 滑动窗口继续往前滑动
  6. 滑动窗口到达数组末尾,程序结束,返回最大的连续数;