设计一个带有getmin功能的栈,保证时间复杂度在O(1)

2017-06-22  20:56:10

需要得到最小值,最简单的思路就是遍历一遍求出最小值。但是这样的时间复杂度会是O(n),不满足O(1)的要求。于是想到在建立一个栈来保存最小值。

具体操作是建立两个栈,一个存放数据,一个存放最小值。

push:首先将数据压入数据栈,若最小值栈为空,则将之压入最小值栈,若最小值栈非空,则需要比较它和最小值栈的顶部数据,若小于等于,则将之压入。这里用到的思想就是,如果当前压入的数据比最小值大,那么目前数据栈的最小值就是最小值栈的栈顶元素,反之则需要将之压入;

pop:将数据栈的元素弹出时需要比较他和最小值栈的栈顶元素大小,若等于的话,也需要将最小值栈的栈顶元素pop出来;

getmin:只需要将最小值栈的栈顶元素返回即可

 1 class Mystack
 2 {
 3     stack<int> s1;
 4     stack<int> mins;
 5
 6 public:
 7     void pop()
 8     {
 9         if(s1.empty()) {cout<<"栈空\n"; return;}
10         else
11         {
12             int temp = s1.top();
13             if(temp == mins.top()){mins.pop();}
14             s1.pop();
15         }
16     }
17
18     void push(int key)
19     {
20         if(mins.empty()) {mins.push(key);cout<<"mins "<<key<<endl;s1.push(key);}
21         else
22         {
23             if(mins.top() >= key) {mins.push(key);cout<<"mins "<<key<<endl;}
24             s1.push(key);
25         }
26     }
27
28     void getmin()
29     {
30         if(mins.empty()) {cout<<"当前栈为空\n";}
31         else cout<<mins.top()<<endl;
32     }
33 };
时间: 2024-09-29 09:52:32

设计一个带有getmin功能的栈,保证时间复杂度在O(1)的相关文章

栈和队列----设计一个有getMin功能的栈

设计一个有getMin功能的栈 设计一个具有getMin功能的栈,可以返回栈中的最小的元素,可以使用现有的栈的数据结构,要求pop/push/getMin操作的时间复杂度是O(1). package com.test; import java.util.Stack; /** * Created by Demrystv. */ public class GetMinStack { //定义两个栈,一个存放正常的数据,一个存放最小值 Stack<Integer> stackData = new S

&quot;Coding Interview Guide&quot; -- 设计一个有getMin功能的栈

[题目] 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作 [要求] 1. pop.push.getMin操作的时间复杂度都是O(1) 2. 设计的栈类型可以使用现成的栈结构 [分析] 栈是一种只能在另一端进行操作的具有“先进后出”特性的数据结构,它有push(元素入栈).pop(元素出栈).peek(访问栈顶元素).size(获取栈元素个数)和isEmpty(判断栈是否为空)等基本功能 一般来说,栈并没有提供返回当前栈中最小元素的方法.因为栈只允许在栈顶对元素进行操作

设计一个有getMin功能的栈

最近在看左程云老师的程序员代码面试指南,里面都是一些很经典的算法,贴出来大家一起学习. 题目:实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. 要求:1.pop.push.getMin操作的时间复杂度都是O(1).2.设计的栈类型可以输用现成的栈结构. 方案1: import java.util.Stack; public class GetMinStack1 { public static class MyStack1 { private Stack<Integer

左神算法书籍《程序员代码面试指南》——1_01设计一个有getMin功能的栈

[题目] 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. [要求] 1.pop.push.getMin操作的时间复杂度都是O(1).2.设计的栈类型可以使用现成的栈结构. [题解] 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作.[要求]1.pop.push.getMin操作的时间复杂度都是O(1).2.设计的栈类型可以使用现成的栈结构. 解题思路: 使用一个辅助栈,里面存的目前栈中的最小值 1 #pragma once 2 #inclu

【算法题】1-设计一个有getMin功能的栈

题目 设计一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. 要求 pop push getMin操作的时间复杂度都是O(1) 设计的栈类型可以使用现成的栈结构 解答 在设计上使用两个栈,一个栈用来保存当前栈中的元素,其功能和一个正常的栈没有区别,这个栈记为stackData:另一个栈用于保存每一步的最小值,这个栈记为stackMin.实现方案有2种: 第一种设计方案 压入数据规则 假设当前数据为newNum,先将其压入stackData.然后判断stackMin是否为空:

算法之设计一个有getMin方法的栈结构

要求该栈的getMin方法和push和pop方法的时间复杂度都是O(1). 设计方案一: package coding.chapter01; import java.util.Stack; /** * Created by Needle on 2017/3/17. */ public class GetMinStack { private Stack<int> dataStack;//存储数据的栈 private Stack<int> minStack;//存储最小值的栈 publ

UE4笔记:利用Widget设计一个切换材质功能

UE4引擎中的Widget蓝图是一个重要的工具,可用于场景中的页面叠加,镜头绑定,场景切换等多处地方,在这里笔者介绍一种利用控件蓝图和场景中物体进行信息交互的方法,直观的体现就是进行物体的材质切换. 1.创建控件蓝图 控件蓝图不同于一般的逻辑蓝图,主要表现在其需要进行画面的设计和平铺.在内容浏览器中创建一个控件蓝图,命名为SwitchMat_UI 双击打开控件蓝图编辑器,进行页面的设计布局. 拖放一个水平盒子到页面中,位置和大小如下图所示(可根据个人喜好进行布局),命名为SwitchMat,同时

实现具有getMin功能的栈

#include "stack.h" #include <stdlib.h> #include <stdio.h> Stack SMin, SData; int PUSH(int *_d) { int temp = 0; PushStack(&SData, _d); if(EmptyStack(&SMin) == 0) PushStack(&SMin, _d); else { GetTopStack(&SMin, &tem

实现一个带有指纹加密功能的笔记本(Android)第一部分

自己经常会忘记一些密码什么的,想把这些密码保存下来,但是别人做的软件总有一点不安全的感觉,所以自己动手做了一个带有指纹加密的笔记本. 以下是本工程用到的一些第三方包 compile 'org.greenrobot:greendao:3.2.0' compile 'net.zetetic:android-database-sqlcipher:3.5.1' compile 'com.getbase:floatingactionbutton:1.10.1' 其中greendao是一款比较好用的开源数据