题目地址:
https://leetcode.com/problems/max-consecutive-ones-iii/
给定一个 0 − 1 0-1 0−1数组 A A A,再给定一个数 k k k,允许将其中的 k k k个 0 0 0变为 1 1 1,问得到的数组中,最长的 1 1 1子数组长度。
题目相当于在问,最长的只含不超过 k k k个 0 0 0的子数组的长度是多少,可以用双指针来做。开两个指针 i i i和 j j j,并保持 j ≤ i j\le i j≤i,并用一个变量来存 A [ j : i ] A[j:i] A[j:i]里的 0 0 0的个数,如果个数小于等于 k k k,那更新答案,否则右移 j j j同时更新个数。代码如下:
class Solution {
public:
int longestOnes(vector<int>& a, int k) {
int res = 0, zero_cnt = 0;
for (int i = 0, j = 0; i < a.size(); i++) {
zero_cnt += 1 - a[i];
if (zero_cnt <= k)
res = max(res, i - j + 1);
else {
while (zero_cnt > k) zero_cnt -= 1 - a[j++];
}
}
return res;
}
};
时间复杂度 O ( l A ) O(l_A) O(lA),空间 O ( 1 ) O(1) O(1)。