题目
给定一个有序数組arr,代表数轴上从左到右有n个点arr [0]、arr[1]...arr[n-1],给定一个正数L,代表一根长度为L的绳子,求绳子最多能覆盖其中的几个点。
- 从最左的点开始构造窗口,窗口右边界为往右取的节点,每次取节点时判断是否超过绳子长度,没有超过窗口右边界更新为下一个节点,如果超过则窗口左边界往右移动一个节点,继续判断右节点是否超过
- 因为窗口左右边界都不会回退的节点,所以时间复杂度为O(N)
// 滑动窗口结构,因为left和right都是不会回退的,所以时间复杂度为O(N)
function process(arr, len) {
let left,
right = 0;
let maxLen = 0;
let j = 0;
while (right < arr.length) {
if (arr[right] - arr[left] <= len) {
j++;
right++;
continue;
} else {
if (j > maxLen) {
maxLen = j;
}
j = 0;
left++;
}
}
// 所有点都在len范围内
if (j > maxLen) {
maxLen = j;
}
return maxLen;
}
console.log(process([2, 99, 101, 102, 103, 300], 90));