首页 国际新闻 正文

恶霸犬,算法|最小堆栈的设计,max

规划一个支撑 push,pop暴风,top 操作,并能在常数时间内检索到最小元素的栈。

  • push(x) — 将元素 x 推入栈中。

  • pop题西林壁古诗() — 删去栈顶的元素。

  • top() — 获取栈顶元素红楼之怡琏幽梦。

  • getMin() — 检索栈中的最小元素。

示例:

MinStack minS橘tack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3检讨书怎样写);
minStack.getMin(); --> 回来 -3.
minStack.pop();
minStack.top(); --> 回来 0.
minStack.getMin(); --> 回来 -2.

解题思路1

选用两个原始的栈来进行规划,其间一个栈Joyrun仍进行正常的入aslsdtkln栈出栈操作,另一个栈寄存的是遍历过程中遇到的最小元素值。下图以入栈 -2->0->-3为例来演示作用


class MinStack {

Sta林亚金ck<Integer> stack;
Stack<Integer> minst;

/** initialize your data structure here. */
public MinStack() {
stack = new Stack<>();
恶霸犬,算法|最小仓库的规划,max minst = new St恶霸犬,算法|最小仓库的规划,maxack<>();
}

public void push(int x) {
恶霸犬,算法|最小仓库的规划,max stack.push(x);
if(minst.empty() || x<=minst.peek()){
minst.push(x);
}
}

public void pop() {
if(stack.pop().equals(mins尸家路t.peek())){
minst.pop();
}
}

public int top() {
return stack.peek();
}

public int getMin() {
return minst.peek();
}
}

解题思路2

选用一个栈来规划,每次入栈两个元素,一个元素是原始数据,一个元素是当时最小值。

class MinStack {

Stack<Integer> stack;

/** initializ恶霸犬,算法|最小仓库的规划,maxe y吕述国our data structure here. */
public MinStack() {
stack = new Stack&guilt;>(少年王);
}

skiinmode public void push(int x) {
if(stack.empty()){
stack.push(x);
stack.push(x);
}else{
int min = stack.peek();
if(x<=min){
stack.push(x);
stack.push(x);
}else{
stack.push(x);
stack.push(min背景音乐);
}
}
}

public void pop(天津小客车摇号成果查询) {
stack.pop();
stack.pop();

}

public int top() {
in恶霸犬,算法|最小仓库的规划,maxt min = stack.pop();
int res = stack.peek();
stack.push(min);
恶霸犬,算法|最小仓库的规划,max return res;
}

public int getMin() {
return stack.peek();
}
}

解题思路3

同样是选用一个栈来规划,在解题思路2 中咱们每次需求入栈两个元素,即需求2倍的存储空间。

这儿面有一些场景下是晦气的,举个比如:1->3->5->7->9->0, 在这个比如中假如按解题思路2 ,在仅入职的状况下的栈内元素是这样的:1->1->3->1->5>1->7->1->9->1->0->0, 可见关于后边入栈的元素大多数都比第一个大的状况,但每次入职均需求存储本身数据和最小值1;造成了空间的糟蹋。

因而能够做一些优化,用一个变量来保存最小值,只有当入栈元素小于等于米粉最小值时,就存储最小值和入栈元素两个值,不然仅存储入栈元素。在方才的比如中便是这样:Max->1->3->5->7->9->1->0。在出栈时假如栈顶元素等于最小值,就出栈两个,一起改变最小值。不然就正常出栈一个元素即可。

class MinStack {

Stack<Integer> stack;
int min;

/** initialize your dat好涨a structure here. */
public 恶霸犬,算法|最小仓库的规划,maxMinStack() {
stack = new Stack<>();
min = Integer.MAX_VALUE;
}

public void push(int x) {
if(x<=min){
stack.push(min);
min = x;
}
stack.push(x);
}

public void pop() {
if(stack.pop()==min){
min = stack.pop();
}
}

public int top() {
return s神祇禹枫tack.peek();
}

public int getMin() {
return min;
}
}

每天进汪永芳步一点点