最大连续1的个数 III

22 阅读1分钟

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

public class LongestOnes {

    /**
     * 1. 从左往右遍历:
     *  1. 如果当前位置的数值为1,则count++;并获取max和count的最大值;
     *  2. 如果当前位置为0:
     *      1. 判断k是不是大于0:
     *          如果大于0, 则反转当前的0 为1,k--;
     *          如果小于0, 则从当前记录往前找count个参数,从那个参数开始遍历,获取到为0的值; (从当前范围内,寻找最早的0代替当前的0)
     * @param nums
     * @param k
     * @return
     */
    public static int longestOnes(int[] nums, int k) {
        int count = 0;
        int max = 0;

        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == 1) {
                count++;
            } else {
                if ( k > 0) {
                    k--;
                    count++;
                } else {
                    int tmp = i - count;
                    while (tmp < i) {
                        count--;
                        if(nums[tmp] == 0) {
                            count++;
                            break;
                        }
                        tmp++;
                    }
                }
            }
            max = Math.max(count, max);
        }
        return max;
    }

    /**
     * lsum: 可以当做从最左侧开始,到left 位置,数据为0的个数;(不包含left)
     * rsum: 可以当做从最左侧开始,到right位置,数据为0的个数;(不包含right)
     * @param nums
     * @param k
     * @return
     */
    public int longestOnes1(int[] nums, int k) {
        int n = nums.length;
        int left = 0, lsum = 0, rsum = 0;
        int ans = 0;
        for (int right = 0; right < n; ++right) {
            rsum += 1 - nums[right];
            while (lsum < rsum - k) {
                lsum += 1 - nums[left];
                ++left;
            }
            ans = Math.max(ans, right - left + 1);
        }
        return ans;
    }
}