滑动窗口 正数数组累加和等于k的最长子数组

105 阅读1分钟

题目

给定一个正数数组,求所有累加和等于k的最长子数组

  • 通过设置窗口,如果当前累加和大于k,那么向右移动左指针,如果累加和小于k,向右移动右指针,如果累加和等于k,那么记录窗口长度然后向右移动左指针,如果窗口长度已经为0,累加和还是大于k,则左右指针都向右移动
function process(arr, k) {
  let left = 0,
    right = 0,
    max = 0,
    sum = arr[0];

  while (right < arr.length) {
    if (sum > k) {
      sum -= arr[left];
      if (left === right) {
        left++;
        right++;
      } else {
        left++;
      }
    } else if (sum < k) {
      right++;
      if (right === arr.length) {
        break;
      }
      sum += arr[right];
    } else {
      const len = right - left + 1;
      max = Math.max(max, len);
      sum -= arr[left];
      left++;
    }
  }

  return max;
}