155Min Stack
最近为了提高数据结构和算法能力,保证每天一到leetcode的题目。从easy开始,感觉这道题目还蛮好,记录一下。
题目大意:就是维护一个栈,获得栈中元素的的最小值。
首先想到,在栈里面设置一个min变量,当栈push一个数时,和min比较,如果比他大,min不变,比他小,min更新。但是这样,pop了min之后就没有了min的数据了……
也就是说,min这个数据,不只要维护当前的最小值,还要有之前的栈里面的数据信息。也就是说,min这个数据应该和栈同步增长数据和减少数据,这样自然想到min应该也是一个栈。而且这个栈的栈顶应该是整个栈的最小值,这样,才能取出来。于是,很自然的想到,minstack这个栈,在datastack进行push(x)操作的时候,minstack要取出他的栈顶元素(最小值min),和x进来的值进行比较,如果x>min,minstack就push(min),否则,push(x);
代码实现:
class MinStack {
public:
stack<int> dataStack;
stack<int> minStack;
void push(int x) {
dataStack.push(x);
if(minStack.empty())
{
minStack.push(x);
return;
}
int min=minStack.top();
if(min<x)
{
minStack.push(min);
return;
}
minStack.push(x);
}
void pop() {
dataStack.pop();
minStack.pop();
}
int top() {
return dataStack.top();
}
int getMin() {
return minStack.top();
}
};
后来看了solution之后,官方给出了一种优化的办法,就是每次push(x)的时候,都比较min和x的大小,如果x>min,minstack不进行操作,否则,对于minstack进行push(x)的操作。这样相应的pop操作也要改变。每次pop的时候,都要检查pop出来的值x是否大于min,如果是,则minstack不进行操作,如果x==min,那么对minstack进行pop()操作。这样,对于minstack的存储空间有一定的降低。
代码如下:
class MinStack {
public:
stack<int> dataStack;
stack<int> minStack;
void push(int x) {
dataStack.push(x);
if(minStack.empty())
{
minStack.push(x);
return;
}
int min=minStack.top();
if(min>=x)
{
minStack.push(x);
return;
}
}
void pop() {
int num=dataStack.top();
int min=minStack.top();
if(num==min){
dataStack.pop();
minStack.pop();
return;
}
dataStack.pop();
}
int top() {
return dataStack.top();
}
int getMin() {
return minStack.top();
}
};
其实,想到过用最小堆的结构,维护一个最小堆,当栈进行push,最小堆就进行插入操作,这样的话push,top,getMin都可以比较好的做到,但是pop没办法。当栈进行pop操作的时候,最小堆没有办法删除对应的那个元素。(其实后来想了一下可以做到删除非栈顶元素,但是查找和删除的代价太大,特别是查找,应该要达到O(N)的时间复杂度了,而且删除非栈顶元素,失去了最小堆的特性了)
版权声明:本文为博主原创文章,未经博主允许不得转载。
155Min Stack的更多相关文章
- [LeetCode]题解(python):155-Min Stack
题目来源: https://leetcode.com/problems/min-stack/ 题意分析: 实现一个小的栈,包括初始化,push,pop,top,和getMin. 题目思路: 私用是用两 ...
- 线性数据结构之栈——Stack
Linear data structures linear structures can be thought of as having two ends, whose items are order ...
- Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)
--reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...
- [数据结构]——链表(list)、队列(queue)和栈(stack)
在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
- Stack Overflow 排错翻译 - Closing AlertDialog.Builder in Android -Android环境中关闭AlertDialog.Builder
Stack Overflow 排错翻译 - Closing AlertDialog.Builder in Android -Android环境中关闭AlertDialog.Builder 转自:ht ...
- Uncaught RangeError: Maximum call stack size exceeded 调试日记
异常处理汇总-前端系列 http://www.cnblogs.com/dunitian/p/4523015.html 开发道路上不是解决问题最重要,而是解决问题的过程,这个过程我们称之为~~~调试 记 ...
- Stack操作,栈的操作。
栈是先进后出,后进先出的操作. 有点类似浏览器返回上一页的操作, public class Stack<E>extends Vector<E> 是vector的子类. 常用方法 ...
- [LeetCode] Implement Stack using Queues 用队列来实现栈
Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...
- [LeetCode] Min Stack 最小栈
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. pu ...
随机推荐
- HipHop算法:利用微博互动关系挖掘社交圈
/* 版权声明:可以任意转载,转载时请务必标明文章原始出处和作者信息 .*/ CopyMiddle: 张俊林 TimeStamp:2012年3 月 在微博环境下,如何 ...
- IT人员----怎么把电脑窗口设置成淡绿色
大夫建议电脑屏幕不要用白色,因为白色对眼睛的刺激是最大的.像我们这样整天对着电脑,也应该注意一下.其实,只要稍微设置一下,就能让你电脑上的窗口从白花花的颜色变成淡淡的绿色. 设置方法:打开控制面板中的 ...
- Nutch的发展历程
Nutch的创始人是Doug Cutting,他同时也是Lucene.Hadoop和Avro开源项目的创始人 下面是Nutch的发展历程: 月由Doug Cutting发起,托管于Sourceforg ...
- Fedora 20忘记root密码
1.忘记root密码的情况下.用sudo账户$sudo su就行了. 2.直接sudo passwd root就重置了roor密码了.
- iOS状态栏字体设置为白色
info.plist 添加字段: view controller -base status bar appearence 设为NO [[UIApplication sharedApplication] ...
- Programming C#.Classes and Objects.成员方法
this关键字指向类的当前实例,this指针是类中所有非静态方法的隐藏指针,每个方法都能通过this指针指向对象的其他方法和成员变量. 因为对一个类来说,它的成员函数(方法)只有一份,所有的实例对象共 ...
- [整理]DLL延时加载 && 设置进程私有环境变量
DLL延时加载鉴于静态和动态加载之间,即无需在代码中显示加载但它内队依然是动态加载的方式只是系统帮处理了.这样做好处是: 1. 可以加快启动时间(因为它是动态加载在需要的时间加载), 2. 减小编写L ...
- php代码20个实用技巧 ------ 转发自菜鸟教程
1.不要实用相对路径 常常会看到: require_once('../../lib/some_class.php'); 该方法有很多缺点:它首先查找指定的php包含路径,然后查找当前目录,因此会检查过 ...
- Java中的String,StringBuffer,StringBuilder详解与区别
1.String Java中string类是不可变的,其中在声明的源代码中用的final,所以只能声明一次.所以每次在明面上的改变其实是重新生成一个String对象,指针指向新的String对象.同时 ...
- threadid=1: thread exiting with uncaught exception (group=0x40db8930)
异常信息如下: 07-26 17:23:49.521: W/dalvikvm(29229): threadid=1: thread exiting with uncaught exception (g ...