Given a binary array nums
and an integer k
, return the maximum number of consecutive 1
's in the array if you can flip at most k
0
's.
Example 1:
Input: nums = [1,1,1,0,0,0,1,1,1,1,0], k = 2 Output: 6 Explanation: [1,1,1,0,0,1,1,1,1,1,1] Bolded numbers were flipped from 0 to 1. The longest subarray is underlined.
Example 2:
Input: nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], k = 3 Output: 10 Explanation: [0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1] Bolded numbers were flipped from 0 to 1. The longest subarray is underlined.
Constraints:
1 <= nums.length <= 105
nums[i]
is either0
or1
.0 <= k <= nums.length
Companies:
Facebook, DE Shaw, Apple, Amazon, Microsoft, Adobe
Related Topics:
Array, Binary Search, Sliding Window, Prefix Sum
Similar Questions:
- Longest Substring with At Most K Distinct Characters (Medium)
- Longest Repeating Character Replacement (Medium)
- Max Consecutive Ones (Easy)
- Max Consecutive Ones II (Medium)
Check out "C++ Maximum Sliding Window Cheatsheet Template!"
Shrinkable sliding window:
// OJ: https://leetcode.com/problems/max-consecutive-ones-iii/
// Author: github.com/lzl124631x
// Time: O(N)
// Space: O(1)
class Solution {
public:
int longestOnes(vector<int>& A, int k) {
int i = 0, j = 0, cnt = 0, N = A.size(), ans = 0;
while (j < N) {
cnt += A[j++] == 0;
while (cnt > k) cnt -= A[i++] == 0;
ans = max(ans, j - i);
}
return ans;
}
};
Or non-shrinkable sliding window:
// OJ: https://leetcode.com/problems/max-consecutive-ones-iii/
// Author: github.com/lzl124631x
// Time: O(N)
// Space: O(1)
class Solution {
public:
int longestOnes(vector<int>& A, int k) {
int i = 0, j = 0, cnt = 0, N = A.size();
while (j < N) {
cnt += A[j++] == 0;
if (cnt > k) cnt -= A[i++] == 0;
}
return j - i;
}
};