演算法題
1.實現一個特殊的棧,在實現棧的基本功能基礎上,在實現返回棧中最小元素的操作
要求:
- pop、push、getMin操作時間複雜度都為O(1)
- 設計棧型別可以用現成的棧結構
思路一:
可以設計兩個棧,其中一個棧的為stackData,另一個棧為stackMin
入棧:假設入棧值為nuwNum
直接入棧stackData中,之後判斷stackMIn是否為空,如果為空,則也入棧stackMin,否則就要判斷stackMin棧頂元素和newNum的大小
如果stackMin棧頂的值更小,那麼newData就不入棧,否則就入棧stackMin(就能保證stackMin棧頂值最小)
出棧
與入棧類似,先判斷stackData是否為空,如果為空,throw報錯,
如果不為空,設定一個value變數等於stackData.pop
因為value的值一定大於等於stackMin棧頂的值,判斷
如果value == stackMin.peek() 那麼 stackMin.pop()
否則,return value
獲取最小值
stackMin的棧頂就是最小值
程式碼:
import java.util.Stack;
/*
* 實現一個特殊的棧,在實現棧的基本功能基礎上,在實現返回棧中最小元素的操作
* 要求:
* pop、push、getMin操作時間複雜度都為O(1)
* 設計棧型別可以用現成的棧結構
* */
public class MyStack1 {
private Stack<Integer> stackData;
private Stack<Integer> stackMin;
public MyStack1(Stack<Integer> stackData, Stack<Integer> stackMin) {
this.stackData = stackData;
this.stackMin = stackMin;
}
// 要求壓棧的時間複雜度為O(1)
public void push(Integer newNum){
stackData.push(newNum);
// 判斷stackMin是否為空:
if (stackMin.empty()){
// 如果為空
// 也壓入
stackMin.push(newNum);
}else if (newNum <= stackMin.peek()){// 如果不為空 看newNum和stackMin棧頂的兩個元素哪個更小
// 如果newNum更小或兩者相等,就壓入stackMin
// 如果stackMin棧頂元素更小,不壓入任何內容
stackMin.push(newNum);
}else {
return;
}
}
// 出棧
public Integer pop(){
if (stackData.empty()){
throw new RuntimeException("This stack is empty");
}
int value = stackData.pop();// 這裡一定是pop不能是peek,否則不會出棧
// 判斷 value和stackMin棧頂的大小
// value一定大於等於stackMin棧頂的值,如果等於,stackMin彈出,否則value彈出
if (value == stackMin.peek()){
stackMin.pop();
}
return value;
}
// 獲取最小值
public Integer getMin(){
if (stackMin.empty()){
throw new RuntimeException("no min Integer");
}else {
return stackMin.peek();
}
}
}
測試:
package org.yyx.it.getMinStack.test;
import org.yyx.it.getMinStack.MyStack1;
import java.util.Stack;
public class TestMyStack1 {
public static void main(String[] args) {
Stack<Integer> stackData = new Stack<>();
Stack<Integer> stackMin = new Stack<>();
MyStack1 myStack1 = new MyStack1(stackData,stackMin);
myStack1.push(3);
myStack1.push(1);
myStack1.push(4);
myStack1.push(2);
myStack1.push(5);
myStack1.push(1);
System.out.println(myStack1.getMin());
System.out.println(myStack1.pop());
System.out.println(myStack1.pop());
System.out.println(myStack1.pop());
System.out.println(myStack1.pop());
System.out.println(myStack1.pop());
System.out.println(myStack1.pop());
}
}
相關文章
- 演算法題:洗牌演算法演算法
- 【演算法題】任務分配問題---匈牙利演算法演算法
- java演算法題Java演算法
- 演算法面試題演算法面試題
- php演算法面試題PHP演算法面試題
- 演算法面試題(二)演算法面試題
- 面試演算法題6面試演算法
- 面試演算法題4面試演算法
- 面試演算法題1面試演算法
- 演算法題 - Pop Sequence演算法
- 演算法題:迴文演算法
- 演算法題系列3演算法
- 演算法面試題:一演算法面試題
- 演算法題系列4演算法
- 演算法題:矩陣鏈乘問題演算法矩陣
- 演算法題:頂點覆蓋問題演算法
- 【JavaScript】前端演算法題 40道題+解析JavaScript前端演算法
- “快速排序演算法”問題的分而治之演算法排序演算法
- 演算法問題基於蟻群演算法求解求解TSP問題(JAVA)演算法Java
- 演算法題-移動零演算法
- 演算法題:三數之和演算法
- js常見演算法題JS演算法
- 演算法題:求眾數演算法
- 面試演算法題記錄面試演算法
- LeetCode演算法題LeetCode演算法
- A+B 演算法問題演算法
- 演算法——路徑問題演算法
- 一道演算法題演算法
- go的演算法問題Go演算法
- 真題演算法考點演算法
- FCC高階演算法題演算法
- 《演算法謎題》書評演算法
- 【演算法】8皇后問題演算法
- (演算法)跳躍問題演算法
- 演算法題常見模板演算法
- 演算法題:ID數量演算法
- google經典演算法面試題-雞蛋問題Go演算法面試題
- Java演算法面試題(009) 毒酒問題Java演算法面試題