劍指offer 演算法 (舉例讓抽象具體化)

2021-07-04 16:37:08 字數 1188 閱讀 3407

題目描述

定義棧的資料結構,請在該型別中實現乙個能夠得到棧最小元素的min函式。在該棧中,呼叫min,push,pop的時間複雜度都是o(1)。

解析:首先是乙個棧,這個棧已經是最常見的那種,我們需要改造它使它能夠在o(1)時間內返回最小元素,剛開始的思路是往棧裡面新增乙個元素放在stack的頂部,表示當前棧裡面的最小元素,如果壓入的元素比它小,那麼更新它,並且將它pop出來,放在乙個臨時值裡面,將剛才要壓入的序列元素push進去棧,再將最小值壓進去,看上去可行。但這樣有問題,比如說我對棧pop操作,我需要將棧頂的最小元素彈出,存起來,然後將真正的棧頂元素彈出,這個時候我要是再把剛才儲存的棧頂元素壓入原棧,就不一定對了,因為刪除乙個元素以後,最小元素也要更新,如何得到次小元素的值呢?明顯我們需要儲存次小,再次小。。。的值,為此我們使用兩個棧,乙個是普通的資料棧,data_stack,和另外乙個auxi_stack輔助棧,首先在空的時候都壓入兩個棧,然後對於壓入的序列,比較這個元素和輔助棧棧頂元素,如果小於這個棧頂那麼在壓入資料棧的時候也壓入輔助站,否則,將輔助棧的頂部元素再次壓入一次,這樣保證了兩個棧的大小相等,這樣才能在pop的時候同步,否則我在呼叫min以後更新候判斷就比較麻煩。

這樣需要的空間就是兩個相等的棧

class solution 

void pop()

int top()

int min()

};

題目描述

輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。

解析:如果下乙個彈出的數字剛好是棧頂數字,那麼直接彈出。如果下乙個彈出的數字不在棧頂,我們把壓棧序列中還沒有入棧的數字壓入輔助棧,直到下乙個需要彈出的數字壓入棧頂為止。如果所有的數字都壓入棧了仍然沒有找到下乙個彈出的數字,那麼該序列不可能是乙個彈出序列。

class solution 

while( ( cnt2 < length2 ) && ( _data.top() == popv[cnt2] ) )

if( cnt1 == (length1-1) )}}

};

劍指offer 演算法 (舉例讓抽象具體化)

題目描述 從上往下列印出二叉樹的每個節點,同層節點從左至右列印。解析 從上往下遍歷 root結點 左結點 右結點 每遍歷乙個依次存入佇列 由佇列的先進先出 依次便可逐層存結點入陣列中 struct treenode class solution return array 題目描述 輸入乙個整數陣列,...

劍指offer 舉例讓抽象具體化

問題描述 定義棧的資料結構,請在該型別中實現乙個能夠得到棧中所含最小元素的 min 函式 時間複雜度應為 o 1 注意 保證測試中不會當棧為空的時候,對棧呼叫 pop 或者 min 或者 top 方法。const datastack 棧 const minstack 儲存棧中最小的元素 functi...

演算法 劍指offer

思路 若百位上數字為0,百位上可能出現1的次數由更高位決定 若百位上數字為1,百位上可能出現1的次數不僅受更高位影響還受低位影響 若百位上數字大於1,則百位上出現1的情況僅由更高位決定。舉例 個位1出現的次數 round 1 1 每次迴圈1出現一次,0 9迴圈了53次,第54次迴圈為0 4 十位1出...