栈实现:入栈、出栈、取最小元素的时间复杂度都是O(1)。
2018-01-13 16:46
295 查看
场景:
实现一个栈,带有出栈(pop),入栈(push),取最小元素(getMin)三个方法。要保证这三个方法的时间复杂度都是O(1)。方法一:
设两个栈A/B,A:存放原始数据,B:栈顶为最小元素,其余为最小元素的备胎;
入栈:
(1) 当第一个元素进入栈A时,索引“0”进入栈B。索引“0”所指即为栈A的当前最小值;
(2) 每当新元素进入栈A时,将新元素与B的栈顶元素(即栈A当前最小值)对比。若新元素小于B的栈顶元素,则新元素的下标进入栈B;
出栈
当A有出栈时,若A栈顶元素的索引为B的栈顶元素(即,出栈元素为A的最小值),则B的栈顶元素出栈。出栈后,B的栈顶元素指向A原本第二小元素,即A当前最小元素。
取最小元素。
B的栈顶所指向的即为栈A的最小元素。
方法二:
使用带有尾指针的单链表。
链表结点结构
class Node { int value; int min; Node *next; public Node(int value, int min) { this.value = value; this.min = min; } }
栈操作
class MinStack { Node *top; public MinStack(){ } // 入栈 public void push(int value) { if (top == null) { top = new Node(value, value); } else { Node* e = new Node(value, Math.min(value, top.min)); e->next = top; top = e; } } // 出栈 int pop() { if (top == null) { throw new Exception("Stack is empty"); } int result = top->value; Node* temp = top; top = top->next ; free(temp ); return result; } public int getMin() { return top->min; } }
相关文章推荐
- O(1)时间复杂度实现入栈、出栈、获得栈中最小元素、获得栈中最大元素
- 定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素。要求函数 min、push 以及 pop 的时间复杂度都是 O(1)。
- 面试题:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素,要求函数min,push及pop的时间复杂度都是O(1)
- 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。时间复杂度都是O(1)
- 17_7_19:实现一个栈要求实现入栈、出栈、获得最小值的时间复杂度为O(1)
- 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)
- 实现一个栈(元素遵守先入后出顺序),能够通过 min 方法在 O(1)时间内获取栈中的最小元素。同时,栈的基本操作:入栈(Push)、出栈(Pop),也是在O(1)时间内完成的
- 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。
- 每天学习一算法系列(5)(已知两个数组,数组里的元素有正有负,但是都是按照从小到大已经排好序,要求用尽可能小的时间复杂度编写一算法求出两个数组的最大交集)
- 1. 实现一个栈,要求实现 Push (出栈)、 Pop (入栈)、 Min (返回最小值的操作) 的时间复杂度为 O(1)
- 实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- Java 在栈中以常数时间求出栈中最小元素
- 双栈实现队列、双队列实现栈、实现一个栈Push(出栈)Pop(入栈)Min(返回最小值的操作)的时间复杂度为O(1)
- 提出支持栈的Push和Pop操作以及第三种操作FindMin的数据结构,其中FindMin返回该数据结构的最小元素 所有操作在最坏的情况下的运行时间都是O(1)
- 定义一个栈的数据结构,要求实现一个min函数,每次能够得到栈的最小值,并且要求Min的时间复杂度为O(1)
- 设计一个栈,出栈时弹出栈中最小的元素,时间复杂度为1
- 实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- 如何用O(1)的时间复杂度求栈中最小元素
- 定义一个栈的数据结构,要求实现一个min函数,每次能够得到栈的最小值,并且要求Min的时间复杂度为O(1)
- O(1)时间复杂度求栈的最小元素