第一题:155. 最小栈
一、题目描述
二、思路
- 创建两个栈,一个
正常栈(存放数据),一个最小栈(存放最小值)。 - 每次往
正常栈存放数据时,同时向最小栈中存入一个最小值。 - 当从
正常栈pop数据时候,最小栈pop出的数据代表正常栈中的最小值。
三、代码实现
四、类似题目
第二题:239. 滑动窗口最大值
一、题目描述
二、思路
- 使用
双端队列的思想。 滑动窗口的宽度为3,那么产生的最大值总数应该是5个。i指针用来扫描元素,代表滑动窗口最后一个元素指针。- 如果
nums[i] >= 队尾,不断删除队尾,直到队尾 > nums[i]为止。 - 当
队尾 > nums[i],将nums[i]插入队尾。 - 检查队头是否
过期,过期则移除。 - 设置
w窗口的最大值为nums[队头]。
三、实操
- 准备一个
双端队列,内部存放的是索引。队列中的元素从头到尾对应的元素值是逐渐减小的。 - 移动双端队列,将满足条件的值放入队列中。
- 当
w指针合法(有值)的时候,窗口的最大值即为双端队列头部值7。 - 再次滑动
滑动窗口,要保证双端队列中的索引是否过期。即是否在w和i指针之间。窗口的最大值仍然为双端队列头部值7。 - 滑动
滑动窗口,将-3插入队列尾部,头部索引1过期,所以移除,窗口最大值为5。 - 滑动
滑动窗口,-1大于-3,则用-1更换-3,并且移除过期头部所以5,窗口最大值为3。 - 滑动
滑动窗口,8大于3和-1,将3和-1从队列中移除,然后将8放入队列,窗口最大值为8。 - 滑动
滑动窗口,2小于8,直接插入双端队列尾部,窗口最大值为8。
三、代码实现
- 时间复杂度
O(n)。