题链接:https://leetcode-cn.com/problems/max-consecutive-ones-iii/
题描述:
解题思路(遍历):
遍历数组,在每个位置上面向后模拟,直到遍历完数组或者可翻转的次数用完。实时维护最长长度。
代码实现(遍历):
/**
* @param {number[]} A
* @param {number} K
* @return {number}
*/
var longestOnes = function(A, K) {
let res = 0;
for (let i = 0; i < A.length; i++) {
let t = K;
let num = 0;
for (let j = i; j < A.length; j++) {
if (A[j] == 1) {
num++;
} else if (t > 0){
num++;
t--;
} else {
break;
}
}
res = res > num ? res : num;
}
return res;
};
时间复杂度:O(n^2)
空间复杂度:O(1)
思路(双指针优化):
上面的代码中我们重复遍历了数组,我们可以使用 left 指针表示子数组的起点,right 表示终点。
如果当前元素为 0 且 K <= 0,则移动 left 指针直到 K > 0 为止。
如果当前元素为 0 且 K > 0,则 K 减一。
代码实现(双指针优化):
/**
* @param {number[]} A
* @param {number} K
* @return {number}
*/
var longestOnes = function(A, K) {
let res = 0;
let left = 0;
let right = 0;
while (right < A.length) {
if (A[right] == 0 && K <= 0) {
while (K <= 0) {
if (A[left] == 0) {
K++;
}
left++;
}
}
if (A[right] == 0 && K > 0) {
K--;
}
res = Math.max(res, right - left + 1);
right++;
}
return res;
};
时间复杂度:O(n)
空间复杂度:O(1)