棧的例題
實現乙個棧,該棧帶有出棧、入棧、取最小元素3個方法。要保證這3個方法的時間複雜度是o(1)。
思路一:
1.建立乙個整型變數min,用來儲存棧中的最小元素。當第乙個元素進棧時,把進棧元素賦值給min,即把棧中唯一的元素當做最小值。
2.之後每當乙個新元素進棧,就讓新元素和min比較大小。如果新元素小於min,則min等於新進棧的元素;如果新元素大於或等於min,則不做改變。
3.當呼叫getmin方法時,直接返回min的值即可。
此時,該方法採用臨時變數暫存棧的最小值,但是只考慮到了進棧的場景,卻沒有考慮出棧的場景。
原本,棧中最小的元素是3,min變數記錄的值也是3.
這時,棧頂元素出棧了。
此時的min變數應該等於幾呢?
雖然此時的最小元素是4,但是程式並不知道。
詳細的解法步驟如下:
1.設原有的棧叫作棧a,此時建立乙個額外的「備胎」棧b,用於輔助棧a。
2.當第乙個元素進入棧a時,讓新元素也進入棧b。這個唯一的元素是棧a的當前最小值。
3.之後,每當新元素進入棧a時,比較新元素和棧a當前最小值的大小,如果小於棧a當前最小值,則讓新元素進入棧b,此時棧b的棧頂元素就是棧a當前最小值。
4.每當棧a有元素出棧時,如果出棧元素是棧a當前最小值,則讓棧b的棧頂元素也出棧,此時棧b餘下的棧頂元素所指向的, 是棧a當中原本第2小的元素,代替剛才的出棧元素成為棧a的當前最小值。(備胎轉正)。
5.當呼叫getmain方法時,返回棧b的棧頂所儲存的值,這也是棧a的最小值。
顯然,這個方法中進棧、出棧、取最小值的時間複雜度時o(1),最壞情況空間複雜度時o(n).
**:
public
class
prostack
}public integer pop()
return mainstack.
pop();
}public
intgetmin()
throws exception
return minstack.
peek()
;}public
static
void
main
(string[
] args)
}
這段**的第乙個輸出是3,因為當時的最小值是3,
第二個輸出是4,因為元素3出棧後,最小值是4。
堅持就是勝利。(以上例題來自網上資料,只是記錄學習。)
演算法學習筆記十三 隨機演算法
按照字典中使用的定義,當事件不可 地發生時,它被認為是隨機的。物件在沒有任何計畫的情況下被建立時稱為隨機。根本的問題是,隨機性是否真的存在,或者我們是否只使用這個術語來建模具有未知規律性的物件和事件。我們要檢查ri和rii是否包含相同的資料。通訊協議的複雜性是為了解決這個決策問題而必須在ri和rii...
演算法 學習筆記
1.輸入輸出演算法至少有乙個或多個輸出 2.有窮性 3.確定性 4.可行性 1.正確性a.演算法程式沒有語法錯誤 b.演算法程式對於合法的輸入資料能夠產生滿足要求的輸出結果 c.演算法程式對於非法的輸入資料能夠得出滿足規格說明的結果 d.演算法對於精心選擇的,甚至刁難的測試資料都有滿足要求的輸出結果...
演算法學習筆記
複雜度分析 1.只關注迴圈次數最多的一行 2.總複雜度等於量級最大 的複雜度 3.巢狀 的複雜度等於巢狀 內外複雜度的乘積 單鏈表結構和順序儲存結構的優缺點 儲存分配方式 時間效能 空間效能 單鏈表結構 用一組任意的儲存單元存放線性表元素 查詢 o n 插入和刪除 找到某位置的指標後,插入和刪除的時...