Given an array A
of 0s and 1s, we may change up to K
values from 0 to 1.
Return the length of the longest (contiguous) subarray that contains only 1s.
Example 1:
Input: A = [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: A = [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.
Note:
1 <= A.length <= 20000
0 <= K <= A.length
A[i]
is0
or1
题目链接:https://leetcode.com/problems/max-consecutive-ones-iii/
题目分析:记录到每个点时0的个数,然后两点法即可,区间内0的个数用nums0[r] - nums0[l - 1]算出
6ms,时间击败17%
class Solution {
public int longestOnes(int[] A, int K) {
int[] nums0 = new int[A.length + 1];
int ans = 0, l = 0;
for (int r = 0; r < A.length; r++) {
nums0[r + 1] += nums0[r] + (A[r] == 0 ? 1 : 0);
while (l <= r && nums0[r + 1] - nums0[l] > K) {
l++;
}
ans = Math.max(ans, r - l + 1);
}
return ans;
}
}
其实可以不用nums0数组,通过一个变量记录当前0的个数即可
4ms,时间击败81.7%
class Solution {
public int longestOnes(int[] A, int K) {
int nums0 = 0, ans = 0, l = 0;
for (int r = 0; r < A.length; r++) {
if (A[r] == 0) {
nums0++;
}
if (nums0 > K) {
if (A[l] == 0) {
nums0--;
}
l++;
}
if (nums0 <= K) {
ans = Math.max(ans, r - l + 1);
}
}
return ans;
}
}