滑动窗口 绳子能放进的最多节点

70 阅读1分钟

题目

给定一个有序数組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));