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 ...
随机推荐
- DevExpress中ChartControl柱状图(Bar)用法
我的数据 代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 chartControl1.Series.Clear(); ...
- data按钮
1.加载状态 通过按钮(Button)插件,您可以添加进一些交互,比如控制按钮状态,或者为其他组件(如工具栏)创建按钮组. 如需向按钮添加加载状态,只需要简单地向 button 元素添加 data-l ...
- How to close existing connections to a DB
use master ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE --do you stuff here A ...
- AngularJS 实战讲义笔记
第一部分 快速上手 1.1 感受AngularJs四大核心特性(MVC, 模块化,指令系统,双向数据绑定)1.2 搭建自动化的前端开发,调试,测试环境 代码编辑工具 (sublime) 断点调试工具 ...
- ORA-01652 错误中报出的不是Temp表空间的情况。
ORA-01652 unable to extend temp segment by %s in tablespace %s 注意这里的temp segment并不一定就是指临时表空间, 也可能是其 ...
- java中的堆、栈、常量池
java中的堆.栈.常量池 分类: java2010-01-15 03:03 4248人阅读 评论(5) 收藏 举报 javastring编译器jvm存储equals Java内存分配: 1. 寄存器 ...
- C++学习笔录1
1.在实际开发中,引用类型变量值用于函数的参数中.它不会另外开辟空间(提高了程序效率),他相当于变量的别名,代表的就是当前这个变量的地址空间.(引用的底层用的是指针.因此从底层的角度讲,其实它的效率是 ...
- Qt 控件
一.布局管理器 QHBoxLayout 水平布局 QVBoxLayout 垂直布局 QGridLayout 格点布局 QFormLayout 关联布局 QSplitter 分裂器 Spacers 间隔 ...
- C语言学习——C程序的运行机理
预处理: #include<xxx> 尖括号表示库文件:#include"xxx" 双引号表示自己写的文件. #include后面的文件格式允许多种,但若要是" ...
- MySql数据库root密码修改
方法一: 在my.ini的[mysqld]字段加入:skip-grant-tables重启mysql服务,这时的mysql不需要密码即可登录数据库 然后进入mysqlmysql>use mysq ...