与队列相关的题目
长度最小的子数组[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;
}