題目:對現在的stack(棧)資料結構進行改進,加乙個min()功能,使之能在常數,即o(1),時間內給出棧中的最小值。可對push()和pop()函式進行修改,但要求其時間複雜度都只能是o(1)。
分析:要使pop,push,min都是o(1),所以肯定要犧牲點空間
思路:1:在stack的資料結構中加兩個個字段,如
typedef struct stack;
pop,push的時候都去棧頂元素,所以是o(1)
min的時候取stack的min欄位,所以也是o(1)
每次push的時候進行比較,如果當前push的元素比stack->min小,則用當前元素替換stack->min,用原來的min替換second。如果當前push的元素比stack->min大,但比second小,則用當前元素替換stack->second。於是達到了取min的效果,程式如下
int push(stack * s,int x)
s->data[s->top++]=x;
if(xmin)
s->min=x;
return 0;
} 每次pop的時候進行比較,如果pop的元素為min,則用second替換min。於是達到了取min的效果,程式如下
int pop(stack *s,int *x)
(*x)=s->data[s->top--];
if(x==s->min) s->min=s->second;
return 0;
} int min( stack *s,int *x )
思路2:設定輔助棧ass,記錄每個狀態下的最小值,每次插入時,得到輔助棧當前值,和插入的值比較
如果小則插入到最小值棧的就是它,否則就是原來的最小值,通過這種方式,pop,push,min三個都是
o(1)演算法的。
typedef struct stack;
static int push_stack(stack *s,int x)
s->data[s->top++]=x;
return 0;
} static int pop_stack(stack *s,int *x)
(*x)=s->data[s->top--];
return 0;
} int push(stack *main,stack *ass,int x)
else
return 0;
} int pop(stack *main,stack *ass,int *x)
int min(stack *ass,int *x)
Google 的面試題
一輛學校班車裡面能裝多少個高爾夫球?你被縮小到只有硬幣厚度那麼點高 不是壓扁,是按比例縮小 然後被扔到乙個空的玻璃攪拌器中,攪拌刀片一分鐘後就開始轉動。你怎麼辦?要是讓你清洗整個西雅圖的所有窗子,你會收取多少費用?怎麼才能識別出電腦的記憶體堆疊是向上溢位還是向下溢位?你要向你8歲的侄子解釋什麼是資料...
google雜湊面試題
題目 在乙個字串中找到第乙個只出現一次的字元。如輸入abaccdeff,則輸出b。用雜湊表解題 分析 這道題是2006年google的一道筆試題。解 由於字元 char 是乙個長度為8的資料型別,因此總共有可能256 種可能。於是我們建立乙個長度為256的陣列,每個字母根據其ascii碼值作為陣列的...
Google 的面試題
google 的面試題 這些應該都屬於智力測試類的題目吧,開始想想答案。一輛學校班車裡面能裝多少個高爾夫球?你被縮小到只有硬幣厚度那麼點高 不是壓扁,是按比例縮小 然後被扔到乙個空的玻璃攪拌器中,攪拌刀片一分鐘後就開始轉動。你怎麼辦?要是讓你清洗整個西雅圖的所有窗子,你會收取多少費用?怎麼才能識別出...