LEETCODE 155
来源:互联网 发布:js swipeleft 编辑:程序博客网 时间:2024/04/29 19:37
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
- push(x) -- Push element x onto stack.
- pop() -- Removes the element on top of the stack.
- top() -- Get the top element.
- getMin() -- Retrieve the minimum element in the stack.
建立一个栈功能可以有很多办法,比如利用动态数组,利用链表,这里选用STL中的VECTOR
考虑如下:
(1)getMin 功能,如果每次在当前栈里面遍历需找,太麻烦了切时间消耗过大;因此考虑重新建立一个栈,里面保存最小的值,当当前Pop掉的值不是最小值,则不变动最小栈,如果Pop掉的值是最小的,则同时Pop掉当前最小值。
一开始对于最小值栈的理解不够透彻,有两点没有想通:
1.如果有多个相同的最小值怎么处理,Pop掉最小值后,最小栈没有当前最小值了,但是原栈还有。
2.最小栈的入栈规则怎么确定,最开始我以为是来一个值,判断当前大小,在最小栈里面找到应该有的位置,后面才发现这个思路和每次遍历得到最小值没有什么区别。
后来确定的入栈规则是:
1.如果当前值小于最小等于最小栈的头值,则入栈。这里取可以等于,就排除了上一点1,如果有多个,就在最小栈保存多个。
还有一点没有想通的是,如果当前值A大于最小栈的头值怎么办?就不管了?那万一将当前最小值弹出以后,刚才那个值A变成最小值了呢???这一点想了很久才想通,假如原栈是S1,最小栈是S2,如果当前最小值是min,当前入栈值为data:
1.如果data<=min,则data应该设为最小值,因此两个栈都该压入。
2.如果data>min,则data不应设为最小值,因此只压入S1中,而在S1中,data永远先于min弹出!!这一点非常重要,保证了不会出现上面的情况,即弹出min后,data是最小值,因为data永远比min先弹出。
class MinStack {public: public:void push(int x) {mystack.push_back(x);if (minstack.size() == 0){minstack.push_back(x);return;}if (minstack[minstack.size() - 1] >= x)minstack.push_back(x);}void pop() {if (minstack[minstack.size() - 1] == mystack[mystack.size() - 1])minstack.erase(minstack.end()-1);mystack.erase(mystack.end() - 1);}int top() {if (mystack.size() >= 1)return mystack[mystack.size()-1];else return NULL;}int getMin() {if (mystack.size() == 0)return NULL;elsereturn minstack[minstack.size() - 1];}vector<int> mystack;vector<int> minstack;};
- LEETCODE 155
- Leetcode 155
- LeetCode(155) Min Stack
- leetcode 155: Maximum Gap
- [leetcode 155] Min Stack
- leetCode #155 Min Stack
- LeetCode[155]Min Stack
- leetcode-155 Min Stack
- Leetcode 155: Mini Stack
- leetcode 155 Min Stack
- LeetCode[155]-Min Stack
- leetcode 155:Min Stack
- LeetCode---(155)Min Stack
- leetcode-155-Min Stack
- leetcode 155: Min Stack
- [leetcode] #155 Min Stack
- LeetCode 155 Min Stack
- 【LEETCODE】155-Min Stack
- 单点登录SSO
- ViewPager,java.lang.UnsupportedOperationException: Required method destroyItem was not overridden
- Javascript 加载性能优化
- 配置 IIS 下的FTP服务器
- 【C++探索之旅】第一部分第十课:文件读写,海阔凭鱼跃
- LEETCODE 155
- 渗透测试实践指南(一)
- 单例模式--SingleTon
- Entity Framework 教程(第一版)
- jenkins部署本地项目
- 递归算法思想&&一些简单算法实现
- Java开发中的23种设计模式详解
- : AH00436: No installed service named "Apache2.4". 错误解决过程记录
- UVA 10815 - Andy's First Dictionary