[程式設計題] lc:[面試題 0305 棧排序
阿新 • • 發佈:2020-07-24
[程式設計題] lc:面試題 03.05. 棧排序
題目描述
輸入輸出
思路
主要思路:
利用一個輔助棧來幫助在插入一個元素的時候進行排序,使得我們的主棧內元素始終是有序的(棧底到棧頂大到小),當push一個元素到主棧的時候,實在先看主棧棧頂元素。
- 如果棧頂元素小於當前val,利用輔助棧將主棧棧頂元素先壓入輔助棧,看此時的主棧的棧頂元素與要插入元素val的大小,滿足棧頂元素大於val了的話,就可以把val放入到主棧中了、
- 把val放入主棧後,我們需要從臨時棧中再把元素pop出壓入主棧,
注:主要就是在插入元素的過程中,主棧的元素都是比val大,臨時棧都比val小。
Java程式碼
import java.util.*; //思想,在插入的時候就迴圈檢測主棧元素棧頂,要求主棧元素均大於val,輔助棧均小於val. class SortedStack { //初始棧 Deque<Integer> stack; //臨時棧 Deque<Integer> tempStack; public SortedStack() { stack = new LinkedList<Integer>(); tempStack = new LinkedList<Integer>(); } public void push(int val) { if(stack.isEmpty()){ stack.push(val); }else{ //這裡必須是迴圈多次移動比較棧頂元素的情況 while(!stack.isEmpty() && val> stack.peek()){ tempStack.push(stack.pop()); //把這個主棧棧頂元素拿出放入臨時棧;再繼續比較主棧新的棧頂和val } //退出上述while就找到了val可以放入到主棧的位置 stack.push(val); //此時把臨時棧中的元素都拿回來。 while(!tempStack.isEmpty()){ stack.push(tempStack.pop()); } } } public void pop() { if(stack.isEmpty()){ return; } //直接pop stack.pop(); } public int peek() { if(stack.isEmpty()){ return -1; }else{ return stack.peek(); } } public boolean isEmpty() { return stack.isEmpty(); } } /** * Your SortedStack object will be instantiated and called as such: * SortedStack obj = new SortedStack(); * obj.push(val); * obj.pop(); * int param_3 = obj.peek(); * boolean param_4 = obj.isEmpty(); */
時間複雜度
最壞O(n)