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 中间塞了 k 个 0 嘛。
因此,我们可以把问题转化成:求数组中⼀段最⻓的连续区间,要求这段区间内 0 的个数不超过 k 个
暴力枚举 + 计数器判断 (俩层for循环枚举出所有可能)
class Solution {
public:int longestOnes(vector<int>& nums, int k) {int n = nums.size();int ret = 0;for(int i = 0; i < n; i++){int zero = k; // 在第二个for循环之前保存变量k的值for(int j = i; j < n; j++){if(nums[j] == 0) // 每访问一个0,对zero进行--更新zero--;if(zero >= 0) // 这段子数组区间内0个个数小于k,就对ret进行一次更新ret = max(ret, j-i+1);else // 若0的个数大于k,则此次循环直接跳出break;}}return ret;}
};
class Solution {
public:int longestOnes(vector<int>& nums, int k) {int n = nums.size();int ret = 0;int left = 0, right = 0, zero = k;while(right < n){if(nums[right] == 0) // 1、进窗口zero--;while(zero < 0) // 2、出窗口if(nums[left++] == 0)zero++;ret = max(ret, right-left+1);// 3、更新结果right++;}return ret;}
};