Leetcode 刷題日記 2021.2.6
技術標籤:Leetcode刷題筆記棧java資料結構leetcode
Leetcode 刷題日記
2021.2.6
題目連結:
https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/submissions/
問題描述:
實現一個棧,通過呼叫min()方法,查詢棧中的最小元素,該方法的時間複雜度必須為O(1)
解答1:
棧(Stack)+有序表(SortedList)
程式碼:
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Stack;
class MinStack {
ArrayList<Integer> sortedList = new ArrayList<>();
Stack<Integer> stack = new Stack();
public MinStack() {
}
public void push(int x) {
stack.push(x);
sortedList.add(x);
}
public void pop() {
sortedList.remove (stack.pop());
}
public int top() {
return stack.peek();
}
public int min() {
sortedList.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if(o1 < 0 && o2 >= 0) return -1 ;
else if(o1 > 0 && o2 <= 0) return 1;
else return o1 - o2;
}
});
return sortedList.get(0);
}
public static void main(String[] args) {
MinStack stack = new MinStack();
stack.push(2147483647);
stack.push(-2147483648);
System.out.println(stack.min());
}
}
分析:
時間複雜度:O(nlog(n))
空間複雜度:O(n)
執行結果:
評註:
這是筆者首先想到的方法:通過額外維護一個有序表來實現min函式的常數效能。但是,這個題並沒有較好地完成任務。由於使用了歸併排序,min()方法的時間複雜度遠遠高於O(1) ( 實際為O(nlog(n)) ) ,空間複雜度也不容樂觀。此題的時間要求寬鬆,所以僥倖能過。
題外話:筆者在第一次用這個思路寫程式碼時犯了一個小錯誤。在利用ArrayList的sort()方法時,必須傳入一個Comparator的匿名類。我在實現Comparator的compare()方法時,直接返回o1-o2,這可能會導致整型溢位,需要進行簡單的優化。
解答2:
(摘自https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/solution/mian-shi-ti-30-bao-han-minhan-shu-de-zhan-fu-zhu-z/)
棧+棧
程式碼:
import java.util.Stack;
class MinStack {
Stack<Integer> stack1 = new Stack();
Stack<Integer> stack2 = new Stack<>();
public MinStack() {
}
public void push(int x) {
stack1.push(x);
if(stack2.isEmpty() || x <= stack2.peek()) stack2.push(x);
}
public void pop() {
if(stack2.peek().equals(stack1.pop())) stack2.pop();
}
public int top() {
return stack1.peek();
}
public int min() {
return stack2.peek();
}
}
分析:
時間複雜度:O(1)
空間複雜度:O(1)
執行結果:
評註:
這個方法是筆者比較欣賞的一個方法,其執行時間由三位數降至兩位數,較好地實現了題目的要求。這個思路有助於深入理解棧作為一個“儲存工具”的作用,啟發我們棧可以用來實現“有序儲存”,即棧內元素按升序或降序儲存。