队列相关

56 阅读1分钟

与队列相关的题目

长度最小的子数组[leetcode-209]

题目描述:

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

双指针解答:

//使用双指针
function minSubArrayLen(target: number, nums: number[]): number {
  let start = 0,
    end = 0;
  let res = Infinity;
  let sum = 0;
  while (end < nums.length) {
    sum += nums[end];
    if (sum >= target) {
      let tempRes = end - start + 1;
      while ((sum -= nums[start++]) >= target && start <= end) {
        tempRes--;
      }
      res = res > tempRes ? tempRes : res;
    }
    end++;
  }
  return res === Infinity ? 0 : res;
}

队列解答:

//使用队列
function minSubArrayLen(target: number, nums: number[]): number {
  class Queue {
    queue = [];
    sum = 0;

    put(item) {
      this.sum += item;
      this.queue.push(item);
    }

    out() {
      const item = this.queue.shift();
      this.sum -= item;
      return item;
    }

    getSize() {
      return this.queue.length;
    }
  }

  const queue = new Queue();
  let res = Infinity;

  nums.forEach((item) => {
    if (queue.sum < target) {
      queue.put(item);
    }
    while (queue.sum >= target) {
      res = res > queue.getSize() ? queue.getSize() : res;
      queue.out();
    }
  });
  return res === Infinity ? 0 : res;
}