题目地址: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的更多相关文章

  1. [LeetCode]题解(python):155-Min Stack

    题目来源: https://leetcode.com/problems/min-stack/ 题意分析: 实现一个小的栈,包括初始化,push,pop,top,和getMin. 题目思路: 私用是用两 ...

  2. 线性数据结构之栈——Stack

    Linear data structures linear structures can be thought of as having two ends, whose items are order ...

  3. Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)

    --reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...

  4. [数据结构]——链表(list)、队列(queue)和栈(stack)

    在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...

  5. Stack Overflow 排错翻译 - Closing AlertDialog.Builder in Android -Android环境中关闭AlertDialog.Builder

    Stack Overflow 排错翻译  - Closing AlertDialog.Builder in Android -Android环境中关闭AlertDialog.Builder 转自:ht ...

  6. Uncaught RangeError: Maximum call stack size exceeded 调试日记

    异常处理汇总-前端系列 http://www.cnblogs.com/dunitian/p/4523015.html 开发道路上不是解决问题最重要,而是解决问题的过程,这个过程我们称之为~~~调试 记 ...

  7. Stack操作,栈的操作。

    栈是先进后出,后进先出的操作. 有点类似浏览器返回上一页的操作, public class Stack<E>extends Vector<E> 是vector的子类. 常用方法 ...

  8. [LeetCode] Implement Stack using Queues 用队列来实现栈

    Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...

  9. [LeetCode] Min Stack 最小栈

    Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. pu ...

随机推荐

  1. 关于优化性能<主要是速度方面>的个人心得 【转】

    一个web项目后期的维护主要在于性能方面.数据吞吐量一旦增大各种bug都出来了.那些通过硬件<数据库分表,数据库主从分离,读写分离>等的一些手段此处就不多说了.本文主要在编码方面做一个性能 ...

  2. PSP个人软件开发工具

    (您的阅读是我的荣幸,如有不满之处请留言指正!) 尚未完善.....工作中 为开发人员提供一个PSP工具,简化时间记录工作:同时提供数据使用的工具,帮助开发人提高估算能力.   PSP个人软件开发工具 ...

  3. Java Class类以及获取Class实例的三种方式

    T - 由此 Class 对象建模的类的类型.例如,String.class 的类型是Class<String>.如果将被建模的类未知,则使用Class<?>.   publi ...

  4. Intellij IDEA 2016 mybatis 生成 mapper

    转载地址:http://gold.xitu.io/entry/57763ab77db2a2005517ae3f

  5. Android 动画系列

    Android种最常用的动画: ~1~Tween动画,就是对场景里的对象不断的进行图像变化来产生动画效果(旋转.平移.放缩和渐变) Tweene Animations 主要类: Animation   ...

  6. php随笔2-php+ajax 实现输入读取数据库显示匹配信息

    dropbox_index.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...

  7. JQuerry 权威指南的都市笔记

    jquery 如今发展成集javascript.css.DOM .Ajax于一体的强大框架体系.他的主旨是以更少的代码,实现更多的功能(write less,do more) jquery  的进本功 ...

  8. chrome实现全浏览器跨域ajax请求

    如图,在chrome快捷方式上打开属性栏,在‘目标’栏加上后缀--disable-web-security --user-data-dir.即可实现在此浏览器上所有网页的跨域请求.

  9. ARM Cortex-M3内核的巨大优势

    ARM Cortex-M3相比于ARM其他系列微控制器,具有以下优势或特点: 1. 三级流水线+分支预测 ARM Cortex-M3与ARM7内核一样,采用适合于微控制器应用的三级流水线,但增加了分支 ...

  10. IC卡存储器介绍

    自从80年代中期出现IC电话卡后,基本已取代了原来流行的电话磁卡,磁卡存在存在严重的安全问题,已逐步淘汰.即使IC电话卡,也不能算很安全,卡内所有数据只要有简单的读写装置并按时序操作都能读取,事实上电 ...