百度面試題 最小元素棧設計

2021-06-09 06:03:37 字數 1277 閱讀 4179

題目描述:

設計乙個棧結構,滿足一下條件:min,push,pop 操作的時間複雜度為o(1)。

解題思想:

根據棧的特性,push和pop操作的時間複雜度已是o(1),難點在於怎樣在常數時間內o(1)找出棧中的最小元素值。如果我們在入棧的時候同時記錄棧中的最小的元素,那麼我們就能夠在o(1)的時間內找出min,但題目同時要求push的時間複雜度也為o(1), 那麼,問題轉化為怎麼在o(1)的時間內讓棧頂的元素同時儲存棧中的最小的元素。

考慮這種情況,當每個入棧的元素都保留了在該元素之前入棧的元素的最小值,那麼,在當前的元素入棧時,只需要比較前乙個元素保留的最小值與當前值哪個最小,然後在當前元素中同時儲存插入該元素後整個棧中的最小值,在min查詢時,只需要獲取棧頂元素儲存的最小值遍可獲得整個棧的最小元素值,而pop操作彈出乙個元素時,下乙個棧頂元素同樣保留了整個棧的當前最小元素值。通過這種設計,min, push,pop操作的時間複雜度均達到o(1)。

原始碼如下:

class minstackelement 

~minstackelement() {}

};class minstack

~minstack()

minstack& push(const int&);

int pop();

int min();

void setreserve(const size_t&);

size_t getreserve() const

size_t getsize() const

};minstack& minstack:: resize(const size_t& size)

delete stack;

stack = pmse;

maxsize = size;

return *this;

}minstack& minstack:: push(const int& value)

stack[top].data = value;

min = stack[top].data;

if((0 != top) && (min > stack[top -1].mindata))

stack[top].mindata = min;

top++;

return *this;

}int minstack::pop()

int minstack::min()

void minstack::setreserve(const size_t& r)

百度面試題

有一根27厘公尺的細木桿,在第3厘公尺 7厘公尺 11厘公尺 17厘公尺 23厘公尺這五個位置上各有乙隻螞蟻。木桿很細,不能同時通過乙隻螞蟻。開始時,螞蟻的頭朝左還是朝右是任意的,它們只會朝前走或調頭,但不會後退。當任意兩隻螞蟻碰頭時,兩隻螞蟻會同時調頭朝反方向走。假設螞蟻們每秒鐘可以走一厘公尺的距...

百度面試題

一 選擇題 15分 共10題 1.任何乙個基於 比較 的內部排序的演算法,若對6個元素進行排序,則在最壞情況下所需的比較次數至少為 a 10 b 11 c 21 d 36 2.關係模型有三類完整性約束,定義外來鍵實現的是 完整性.a.實體完整性 b.參照完整性 c.使用者定義的完整性 d.實體完整性...

百度面試題

1.乙個int陣列,裡面資料無任何限制,要求求出所有這樣的數a i 其左邊的數都小於等於它,右邊的數都大於等於它。能否只用乙個額外陣列和少量其它空間實現。2.乙個檔案,內含一千萬行字串,每個字串在1k以內,要求找出所有相反的串對,如abc和cba。當時怎麼想的忘記了,現在重新思考一下,檔案的大小上限...