《演算法分析與設計》Week 18

2021-08-02 02:37:04 字數 1452 閱讀 1760

155. min stack

description:

design a stack that supports push, pop, top, and retrieving the minimum element in constant time.

example:

minstack minstack = new minstack();

minstack.push(-2);

minstack.push(0);

minstack.push(-3);

minstack.getmin(); --> returns -3.

minstack.pop();

minstack.top(); --> returns 0.

minstack.getmin(); --> returns -2.

solution:

一、題意理解

實現乙個棧,在保留原有功能的基礎上,增加乙個getmin()函式,獲取當前棧的最小值。

二、分析

1、當然,既然是乙個演算法題,getmin()函式的時間複雜度應該為o(1),而不是每一次gemin()的時候都將棧中的所有資料都pop()出來,找到最小值,再push回去。

2、那既然這樣,我們是否可以設定乙個成員變數cur_min來儲存當前的最小值,一旦有新的值push進來,就跟cur_min比較,更新最小值。可使這樣的話,如果只有push操作是沒問題的,但如果有pop操作,將最小值給pop出去了,我們如何知道第二小的這個值,將它賦值給cur_min呢?

3、所以問題就變成了如何在將最小值pop出去的情況下,能知道第二小的值。一種方法是再開乙個陣列,做排序記錄,將棧中的元素在這個陣列中方做排序,這樣就能知道每一次的最小值,但這樣顯然增加了很多的成本,而且有一些不必要的記錄。另一種方法是我們可以在push的時候就做點文章,一旦有更小的值push進來,我們就先將cur_min入棧,以記錄這個「第二小」值,再將新的「最小值」入棧。出棧的時候如果發現最小值出棧了,就再pop一次,即刻獲取下乙個最小值。額外空間的開銷都是對我們有用的最小值。

4、**如下:

class minstack 

void push(int x)

s.push(x);

}void pop()

}int top()

int getmin()

};/**

* your minstack object will be instantiated and called as such:

* minstack obj = new minstack();

* obj.push(x);

* obj.pop();

* int param_3 = obj.top();

* int param_4 = obj.getmin();

*/

sicily 1006 單詞變換 week 18

這是一道動態規劃的題目,迴圈的時候記得取等號 設需要計算編輯距離的兩個字串分別為x 1.m 和 y 1.n 用e i,j 表示x 1.i 和y 1.j 的編輯距離,則可 以得到動態規劃的狀態轉移方程 當i 0時,e i,j j 當j 0時,e i,j i 當i 0且j 0時,e i,j min 其中...

《演算法分析與設計》Week 8

96.unique binary search trees description given n,how many structurally unique bst s binary search trees that store values 1.n?for example,given n 3,t...

演算法設計與分析

輸入輸出 確定性有窮性 np類問題是非確定性計算模型下的易驗證問題類。所有可以在多項式時間內求解的判定問題構成p類問題 1 二分搜尋技術 二分搜尋演算法的基本思路是對給定已排好序的n個元素a 0 n 1 在這n個元素中找出乙個特定元素x。運用分治的思想,將n個元素以n 2為中心對半分。if x a ...