1. 程式人生 > 其它 >Leetcode 刷題日記 2021.2.6

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)

執行結果:
在這裡插入圖片描述

評註:
這個方法是筆者比較欣賞的一個方法,其執行時間由三位數降至兩位數,較好地實現了題目的要求。這個思路有助於深入理解棧作為一個“儲存工具”的作用,啟發我們棧可以用來實現“有序儲存”,即棧內元素按升序或降序儲存。