lintcode,带最小值操作的栈

本文介绍了一种实现带有取最小值min方法的栈的方法,该方法可以在O(1)时间内完成push、pop和min操作。通过使用两个栈,一个用于存储数据,另一个用于跟踪最小值,确保在任何时候都能快速获取到当前栈中的最小值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值。
你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成。
如下操作:push(1),pop(),push(2),push(3),min(), push(1),min() 返回 1,2,1

解题思路:利用两个栈,一个正常存储数据,另一个存储最小数据,每次加入一个数,就在两个栈里都加入一个元素,其中最小栈加入一个当前最小,这样pop的时候两个栈都可以pop,保证minstack顶部一定是最小值。
一刷没ac
二刷ac

public class MinStack {
    public Stack<Integer> stack;
    public Stack<Integer> minstack;
    public MinStack() {
        stack = new Stack<Integer>();
        minstack = new Stack<Integer>();
    }

    public void push(int number) {
        stack.push(number);
        if(minstack.isEmpty()){
            minstack.push(number);
        }else {
            int value = minstack.peek() >= number ? number : minstack.peek();
            minstack.push(value);
        }
    }

    public int pop() {
        minstack.pop();
        return stack.pop();
    }

    public int min() {
        return minstack.peek();
    }
}
### 使用单调计算区间最大值与区间最小值 #### 计算区间最大值 对于求解滑动窗口中的最大值问题,可以利用单调递减来高效完成。每当遇到一个新的元素时,如果该元素大于等于顶元素,则持续弹出顶直到找到一个更大的元素或将清空;之后将当前元素及其索引压入中。此时底到顶保存着从大到小排列的一系列候选者,而最新的那个就是当前窗口内的最大值。 ```python def maxSlidingWindow(nums, k): from collections import deque q = deque() result = [] for i in range(len(nums)): while q and nums[q[-1]] <= nums[i]: q.pop() q.append(i) if q[0] == i - k: q.popleft() if i >= k - 1: result.append(nums[q[0]]) return result ``` 此代码实现了基于单调递减的滑动窗口最大值查找算法[^2]。 #### 计算区间最小值 同样地,在寻找滑动窗口内的最小值方面也可以采用类似的策略——构建一个单调递增。当新加入的数据小于等于顶端所指向位置处的数据时,不断移除顶部较小数值直至满足条件为止;随后把新的数据连同其对应的下标记入队列之中。最后位于首部的就是当前考察范围里最小的那个数了。 ```python def minSlidingWindow(nums, k): from collections import deque q = deque() result = [] for i in range(len(nums)): while q and nums[q[-1]] >= nums[i]: q.pop() q.append(i) if q[0] == i - k: q.popleft() if i >= k - 1: result.append(nums[q[0]]) return result ``` 上述程序展示了怎样运用单调递增来进行滑动窗口最小值查询操作[^3]。 这两种方法均能在O(n)时间复杂度内解决问题,并且只需要线性的额外空间开销。它们广泛应用于各种实际场景当中,比如股票价格波动分析、实时流量监控等场合下的快速响应需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值