包含min函数的栈

需要O(1)时间求出最小值。如果换成最大值,那就和“滑动窗口的最大值”一题思路差不多了。

用一个栈保存元素,用另一个栈来存储最小值,如果新增的元素比栈顶元素小则压入,否则不压入。

如果检测到第一个栈把最小元素弹出了,那么另一个栈也弹出栈顶元素。

“滑动窗口的最大值”更加复杂一点,而且是用deque保存最大值,如果新增的元素比deque中某些元素大,那么必须把小的元素都去除,然后在deque尾部加入这个新元素。

这里附上“滑动窗口的最大值”的代码。

 1 class Solution {
 2 public:
 3     vector<int> maxInWindows(const vector<int>& num, unsigned int size)
 4     {
 5         deque<int> id;
 6         vector<int> record;
 7         if(num.size()==0||size==0||size>num.size())
 8             return record;
 9         for(int i=0;i<size;i++)
10         {
11             while(!id.empty())
12             {
13                 if(id.back()<num[i])
14                     id.pop_back();
15                 else
16                     break;
17                }
18                id.push_back(num[i]);
19         }
20         record.push_back(id.front());
21         if(size<num.size())
22         {
23             int rear=size;
24             int front=0;
25             while(rear<num.size())
26             {
27                 if(id.front()==num[front])
28                     id.pop_front();
29                 while(!id.empty())
30                 {
31                     if(id.back()<num[rear])
32                         id.pop_back();
33                     else
34                         break;
35                 }
36                 id.push_back(num[rear]);
37                 record.push_back(id.front());
38                 front++;
39                 rear++;
40             }
41         }
42         return record;
43     }
44 };

时间: 2024-10-12 13:56:01

包含min函数的栈的相关文章

包含min函数的栈-剑指Offer

包含min函数的栈 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数 思路 使用一个辅助栈,跟踪原始栈中每个元素在栈口时的该栈的最小值 代码 import java.util.Stack; public class Solution { Stack<Integer> s_data = new Stack(); Stack<Integer> s_min = new Stack(); public void push(int node) { s_data.

微软100题系列之-----设计包含min函数的栈

题意: 定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素. 要求函数min.push 以及pop 的时间复杂度都是O(1). 思路:定义两个栈,一个用来记录数据的插入和删除,一个用来存储最小值的变化 代码如下: template <class T> class Stack { public: Stack(int len=100); T Min(); T Pop(); void Push(T val); private: T top1,top2; T *stack1,*stack

【编程题目】设计包含 min 函数的栈

2.设计包含 min 函数的栈(栈)定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素.要求函数 min.push 以及 pop 的时间复杂度都是 O(1). 我的思路: 用一个额外的元素记录最小值,push时若遇到更小的则更新.但是pop的时候遇到了问题,最小的弹出去了怎么得到下一个最小的值? 总觉得要排序,再存一个min的链.结果没达到O(1). /* 2.设计包含 min 函数的栈(栈) 定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素. 要求函数 min

剑指offer系列源码-包含min函数的栈

题目1522:包含min函数的栈 时间限制:1 秒内存限制:128 兆特殊判题:否提交:1495解决:476 题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为一个整数n(1<=n<=1000000), n代表将要输入的操作的步骤数. 接下来有n行,每行开始有一个字母Ci. Ci='s'时,接下有一个数字k,代表将k压入栈. Ci='o'时,弹出栈顶元素. 输出: 对应每个测

2.设计包含 min 函数的栈

http://zhedahht.blog.163.com/blog/static/25411174200712895228171/ http://blog.csdn.net/anchor89/article/details/6055412 http://blog.csdn.net/sgbfblog/article/details/7752878 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1). 解法一: 使用一个辅助栈来

包含min函数的栈 + 栈的压入、弹出序列

剑指offer 两道关于 数据结构——栈 的题目 1. 包含min函数的栈 简要分析一下这道题,这道题做了3遍才过,踩了一些小坑 看看示例: 得到了规律,那么关键部分的代码实现,就在于 两个栈(rawStack 和 minStack) 和 push() 方法 Stack<Integer> rawStack = new Stack<>(); Stack<Integer> minStack = new Stack<>(); public void push1(i

剑指Offer对答如流系列 - 包含min函数的栈

面试题30:包含min函数的栈 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). 问题分析 push 和 pop均容易实现. 主要就是min函数的定义,如果要通过操作push和pop操作获取最小元素时间复杂度为O(1),基本上是不可能的. 如果我们另外定义一个成员变量 专门存储最小元素的值,但是当最小元素弹出后,min就需要相应改变,所以必须把每次的最小值都存储下来.这个时候不得不考虑采用一个辅助栈

【剑指offer】【栈】30.包含min函数的栈

包含min函数的栈 维护两个栈:栈st存储所有元素,minSt是一个单调栈,栈顶元素为min 1. 入栈:st.push(x); 若minSt.top >= x或minSt为空,x入栈minSt 2. 出栈:若minSt与st栈顶元素相同,则二者都出栈,否则st出栈 3. 获取最小值:若minSt不为空,返回minSt栈顶元素 class MinStack { public: stack<int> st; stack<int> minSt; /** initialize yo

剑指OFFER之包含min函数的栈

题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(1<=n<=1000000), n代表将要输入的操作的步骤数.接下来有n行,每行开始有一个字母Ci.Ci=’s’时,接下有一个数字k,代表将k压入栈.Ci=’o’时,弹出栈顶元素. 输出: 对应每个测试案例中的每个操作,若栈不为空,输出相应的栈中最小元素.否则,输出NULL. 样例输入: 7 s 3 s 4 s 2

包含MIN函数的栈+一个数组实现两个堆栈+两个数组实现MIN栈

1.题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 思路:利用一个辅助栈来存放最小值 栈  3,4,2,5,1 辅助栈 3,2,1 每入栈一次,就与辅助栈顶比较大小,如果小就入栈,如果大就不入栈当前的辅助栈:当出栈时,辅助栈元素相等时也要出栈. class Solution { public: stack<int> mystack1;//辅助栈 stack<int> minstack;//最小栈 void push(int value) { if(