最大连续1的个数

108 阅读1分钟

题目

滑动窗口

public class Main {
    public static void main(String[] args) {

        Main main = new Main();
        int [] nums = new int[] {0, 0, 1, 1, 1, 0, 0};
        main.longestOnes(nums, 0);
    }

    public int longestOnes(int[] A, int K) {

        // 利用一个逐渐扩大的动态窗口, 如果窗口包含的0个数小于K 则移动右指针
        // 否则就平移窗口, 继续判断能否扩大窗口

        int left = 0;
        int right = 0;
        int zeroCount = 0;

        while (right < A.length) {
            if (A[right] == 0) {
                zeroCount ++;
            }

            if (zeroCount <= K) {
                // 可以移动右指针
                right ++;
                continue;
            }

            // 平移窗口
            if (left < A.length && A[left] == 0) {
                zeroCount --;
            }
            left ++;
            right ++;
        }
        return right - left;
    }

}

基本思路

  1. 利用两个指针形成窗口, 当窗口范围内的0的个数小于等于K的时候, 继续扩大窗口, 否则就平移窗口

  2. 明确while循环哪里该改变指针, 哪里该修改0的个数, 别弄晕了

滑动窗口2

public class Main {
    public static void main(String[] args) {

        Main main = new Main();
        int [] nums = new int[] {1,1,1,0,0,0,1,1,1,1,0};
        main.longestOnes(nums, 2);
    }

    public int longestOnes(int[] A, int K) {

        // 利用一个逐渐扩大的动态窗口, 如果窗口包含的0个数小于K 则移动右指针
        // 否则就缩小窗口 移动左边指针

        int left = 0;
        int right = 0;
        int zeroCount = 0;

        int max = 0;
        while (right < A.length && left <= right) {
            if (zeroCount <= K) {
                // 可以移动右指针
                if (A[right] == 0) {
                    zeroCount ++;
                }
                right ++;

            } else {
                // 缩小窗口
                if (A[left] == 0) {
                    zeroCount --;
                }
                left ++;
            }
            if (zeroCount <= K) {
                max = Math.max(right - left, max);
            }

        }
        return max;
    }

}

基本思路

  1. 当窗口范围0的个数超过K的时候, 缩小窗口, 直到符合条件, 才继续扩大窗口

  2. 一定要先判断 再移动指针, 不然边界问题不好处理