LintCode 带最小值操作的栈

本文介绍了一种特殊栈的设计方案,该栈支持常规的push和pop操作,并新增了一个min方法用于获取当前栈中的最小值。所有操作均能在O(1)时间内完成。通过使用两个栈的数据结构,有效地实现了这些功能。

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

实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值。

你实现的栈将支持pushpop 和 min 操作,所有操作要求都在O(1)时间内完成。

您在真实的面试中是否遇到过这个题? 
Yes
样例

如下操作:push(1),pop(),push(2),push(3),min(), push(1),min() 返回 1,2,1

用了两个stack

class MinStack {
public:
    stack<int> date;
    stack<int> mins;
    MinStack() {
        // do initialization if necessary
    }

    void push(int number) {
        // write your code here
        date.push(number);
        if (mins.size() ==0 || mins.top() >=number) {
            mins.push(number);
        }
        else {
            mins.push(mins.top());
        }
    }

    int pop() {
        // write your code here
        if (mins.size()>0 && date.size() > 0) {
          int t = date.top();
        date.pop();
        mins.pop();
        return t;
        }
        return 0;
    }

    int min() {
        // write your code here
        if (mins.size()>0 && date.size() > 0)
        return mins.top();
        return 0;
    }
};


### 使用单调计算区间最大值与区间最小值 #### 计算区间最大值 对于解滑动窗口中的最大值问题,可以利用单调递减来高效完成。每当遇到一个新的元素时,如果该元素大于等于顶元素,则持续弹出顶直到找到一个更大的元素或将清空;之后将当前元素及其索引压入中。此时底到顶保存着从大到小排列的一系列候选者,而最新的那个就是当前窗口内的最大值。 ```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、付费专栏及课程。

余额充值