1. 题目链接
2. 分析
最多可以将K个值从0变成1,因此滑动窗口的限制条件: 0的数量(zeros)小于K
,算法过程如下
- 有一个滑动窗口(slipper),每次都会从A中读入一个数
- 当读入的数为0时,
zeros++
- 当zeros的数量大于K时,会取出slipper首部的元素,当取值为0时
zeros--
总体代码如下:
var longestOnes = function (A, K) {let slipper = [];let len = A.length;let res = 0;let zeros = 0;for (let right = 0; right < len; right++) {slipper.push(A[right]);if (A[right] == 0) {zeros++;}while (zeros > K) {if (slipper.shift() == 0) {zeros--;}}res = Math.max(res, slipper.length);}return res;
};
3. 改进
上述算法效率并不高:
- 数值没有必要每次入栈,只需要使用left、right来界定范围即可
使用left和right来界定滑动窗口中的值
改进后的算法如下:
var longestOnes = function (A, K) {let len = A.length;let res = 0;let zeros = 0;let left = 0;for (let right = 0; right < len; right++) {if (A[right] == 0) {zeros++;}while (zeros > K) {if (A[left++] == 0) {zeros--;}}res = Math.max(res, right - left + 1);}return res;
};
效率大大提高.