集美大学-计算机打卡(n)

## 栈和队列思考续篇

### 栈和队列的基本概念

栈(Stack)和队列(Queue)是常见的数据结构,它们在解决各种问题时都发挥着重要的作用。栈是一种后进先出(Last In, First Out,LIFO)的数据结构,而队列是一种先进先出(First In, First Out,FIFO)的数据结构。这两种数据结构常用于处理临时存储和顺序访问的问题。

### 单调队列的应用 - 滑动窗口最大值

在实际问题中,单调队列常常用于解决滑动窗口的最值问题,其中一个典型的应用是求滑动窗口的最大值。通过维护一个单调递减的队列,我们可以高效地找到滑动窗口中的最大值。

通过判断当前元素是否有可能成为窗口中的最大值,来动态地维护单调递减的队列。这样做的时间复杂度是相对较低的,因为在每个元素入队时,我们只需要考虑其在窗口中的位置和值大小,而不需要逐个比较所有元素。

### 单调队列的模板代码

while (!deque.isEmpty() && deque.peek() < i - k + 1) {
    deque.poll();
}

while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) {
    deque.pollLast();
}

deque.offer(i);

这段代码展示了维护单调递减队列的基本逻辑:

1. 第一个while循环用于移除队列中超出窗口范围的元素。

2. 第二个while循环用于保持队列的单调性,即保证队列中的元素是递减的。如果当前元素比队尾元素大,就不断弹出队尾元素,直到队列为空或者当前元素不再比队尾元素大。

3. 将当前元素的索引加入队列,这样队列中的索引就是窗口中的有效元素。

### 总结

栈和队列是解决各类问题的基础数据结构,而单调队列作为队列的一种特殊应用,对于滑动窗口等问题有着重要的作用。理解并熟练运用单调队列的思想和模板代码,能够帮助更高效地解决相关问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值