題目:Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
push(x) – Push element x onto stack.
pop() – Removes the element on top of the stack.
top() – Get the top element.
getMin() – Retrieve the minimum element in the stack.
翻譯:設計一個含有 push、pop、top、getMin功能的棧,各功能詳細說明如下:
push(x) – 將資料x壓入棧;
pop() – 將資料彈出;
top() – 獲得棧頂資料;
getMin() – 獲得棧中最小元素。
思路一—失敗的方法
失敗方法1:用數組來實現棧,但提交後報錯:error: constructor MinStack in class MinStack cannot be applied to given types;
可能原因:因為用數組來實現的棧,所以在初始化棧時需要給出棧的大小,可能因為這樣與題目要求不符。
失敗方法2:在方法1的基礎上將數組換成ArrayList,不會報上述錯誤了,但總是顯示逾時。
可能原因:在實現getMin()函數時,需要對ArrayList進行遍曆,可能耗時比較長
思路二–可實現
定義兩個棧(可以用ArrayList,也可以用Stack實現),一個正常儲存資料,記為data,一個只有當需要存入的資料小於或等於棧頂資料時才存入,記為minData;出棧時,data可直接出棧,而只有當data棧頂元素與minData棧頂元素相等時,minData才會彈出元素;通過這種方法可以保證minData中的棧頂元素始終是整個棧的最小資料。
例如:
push(4) –>data={4} ; minData={4};
push(4) –>data={4,4} ; minData={4,4};
push(5) –>data={4,4,5}; minData={4,4};
push(3) –>data={4,4,5,3}; minData={4,4,3};
pop() –> data={4,4,5}; minData={4,4};
pop() –>data={4,4}; minData={4,4};
代碼(java)–此處用的是Stack實現,用ArrayList也可以,但會稍微比Stack臃腫一些
import java.util.*;class MinStack { Stack<Integer> data = new Stack<Integer>(); Stack<Integer> minData = new Stack<Integer>(); public void push(int x) { data.push(x); if(minData.isEmpty()||x <= minData.peek()){ minData.push(x); } } public void pop() { if(!data.isEmpty()){ int top = data.pop(); if(top == minData.peek()){ minData.pop(); } } } public int top() { if(!data.isEmpty()){ return data.peek(); }else{ return 0; } } public int getMin() { if(!minData.isEmpty()){ return minData.peek(); }else{ return 0; } }}
找的另一種思路的代碼
class MinStack { Node top = null; public void push(int x) { if (top == null) { top = new Node(x); top.min = x; } else { Node temp = new Node(x); temp.next = top; top = temp; top.min = Math.min(top.next.min, x); } } public void pop() { top = top.next; return; } public int top() { return top == null ? 0 : top.val; } public int getMin() { return top == null ? 0 : top.min; }}class Node { int val; int min; Node next; public Node(int val) { this.val = val; }}