最小棧O 1 空間複雜度實現

2021-10-07 16:07:15 字數 1092 閱讀 7376

設計乙個支援 push,pop,top 操作,並能在常數時間內檢索到最小元素的棧。

push(x) – 將元素 x 推入棧中。

pop() – 刪除棧頂的元素。

top() – 獲取棧頂元素。

getmin() – 檢索棧中的最小元素。

常見的一道題目,很多解答都是兩個棧的做法,這裡提供一下o(1)空間複雜度的做法。

使用兩個棧的原因是,我們pop出最小值的時候,需要將次最小值變成最小值,如果只用乙個min來記錄最小值,那麼無法的到次最小值,那麼關鍵在於,最小值變化的時候,如何得到次最小值?

可以維護乙個棧,和乙個最小值。這裡棧存放的值是每次data與當前minvalue的差值。這樣每次就可以記錄這兩個值了。每次diff = val-min, 如果diff < 0就更新min = val。在pop的時候,如果棧頂大於等於零,說明這個值是小於最小值的,返回min + 棧頂即可; 如果棧頂小於零,說明棧頂的元素就是最小值,pop出去之後需要更新一下最小值,最小值變為min - 棧頂。

方法一:用陣列實現,需要考慮陣列為空,陣列滿了等邊界條件

class

minstack

public

void push (

int val) throws exception

else}}

public

int pop (

) throws exception

else

}public

int top (

) throws exception

public

int min (

)}

方法二:用棧實現,無需考慮邊界條件,stack本身自帶實現

public

class

minstacktwo

else}}

public

intpop()

else

}public

inttop

() throws exception

public

intmin()

}

歸併排序,空間複雜度O 1 的實現

思路 利用原陣列a的空間,兩個下標i和j分別遍歷l1和l2。注意 當l2當前元素較小時,會覆蓋l1的元素。可以利用插入排序,將arr j 插入到l1中。程式c 實現 include include using namespace std void print int arr,int start,in...

歸併排序空間複雜度O 1 的實現

正常的歸併排序是利用分治法,即分解,解決,合併 o n membery mergesort public void mergesort int nums private void helper int nums1,int b,int e void merge int nums1,int b,int ...

實現鍊錶逆序,空間複雜度為O(1)

乙個演算法的空間複雜度只考慮在執行過程中為區域性變數分配的儲存空間的大小,它包括為參數列中形參變數分配的儲存空間和為在函式體中定義的區域性變數分配的儲存空間兩個部分。include using namespace std struct linknode linknode reverselink li...