1004:最大连续1的个数 III
1004:最大连续1的个数 III
给定一个二进制数组 nums
和一个整数 k
,如果可以翻转最多 k
个 0
,则返回 数组中连续 1
的最大个数 。
示例 1:
输入:nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2
输出:6
解释:[1,1,1,0,0,1,1,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 6。
示例 2:
输入:nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
输出:10
解释:[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 10。
提示:
1 <= nums.length <= 105
nums[i]
不是0
就是1
0 <= k <= nums.length
思路
思路:滑动窗口
朋友面试时遇到这道题,对于练习滑动窗口题目,很有参考价值
题目要求最多可以把 K 个 0 变成 1,求仅包含 1 的最长连续子数组的长度
相当于在数组中找连续子数组,子数组当然越长越好,但有个条件【子数组中最多有K个0】
如果滑动窗口(连续子数组)的0个数超过K,则移动滑动窗口左边界
右边界持续移动,直至达到数组尾部
代码如下
// 时间复杂度O(N)
// 空间复杂度O(1)
public static void main(String args[]) {int[] nums = new int[]{1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0};longestOnes(nums, 2);
}public static int longestOnes(int[] nums, int k) {if (nums == null || nums.length == 0)return 0;int slidingWindowLeft = 0;// 滑动窗口左边界int slidingWindowRight = 0;// 滑动窗口右边界int zeroNum = 0;// 滑动窗口中0的个数int length = 0;// 滑动窗口的长度for (slidingWindowRight = 0; slidingWindowRight < nums.length; slidingWindowRight++) {if (nums[slidingWindowRight] == 0) {zeroNum++;}if (zeroNum > k) {// 滑动窗口区间内0的个数大于Kwhile (zeroNum > k) {if (nums[slidingWindowLeft] == 0) {zeroNum--;}slidingWindowLeft++;}}if (slidingWindowRight - slidingWindowLeft + 1 > length)length = slidingWindowRight - slidingWindowLeft + 1;}return length;
}