程式設計之美上的題目,具體忘記了,有乙個佇列,定義了push,pop,maxelement三個函式,其中maxelement要返回佇列中最大的元素,第一次看這個題目就是遍歷,每次maxelement的時候遍歷一遍佇列,具體**不寫了,三個操作的開銷為:
1push:o(
1)
2pop:o(
1)
3maxelement:o(length(que))
於是換成另外一種方法,設定乙個maxval,每次push與進入佇列的元素進行比較,這樣**如下:(為了節省篇幅,利用了stl)
1intmain(
void)2
;89for
(inti=
0;i<5;i
++)1015
cout
<<
maxval
<<
endl;16}
這樣的話只要呼叫maxelement的時候只要返回maxval就可以了
這樣看起來好像沒有問題,有乙個沒想到的地方,就是pop的時候,如果pop是maxval的值,那麼maxval也要進行更新,比如把push_data的元素改成:9,8,5,2,1,那麼當第一次呼叫pop的時候,由於maxval為佇列的top,那麼就必須進行更新,三個操作的開銷分別為
1push:o(1)
2pop:o(1)
||o(length(que))
3maxelement:o(1)
後來想起好像在乙個**看過類似這種題目,找了下,在乙個棧中查詢最小值,有點像吧傳送門如下:
這個是通過輔助棧來做的,看起來這題也可以用輔助佇列,不過要小心了,如果你只是照搬這個的思想,會有個問題,舉個例子,比如我按照順序像佇列push了1,2,4,3,那麼輔助佇列則是:1,2,4,4,這個時候你彈出第乙個最大元素會是多少,1,錯誤了吧
修改下,每次push的時候如果發現當前輔助陣列的最大值小於要push的值,則清空原來的輔助陣列,**如下:
void push(const int &x)
這樣你push了1,2,4,3後,輔助佇列的值為4,3,那麼pop呢??只要pop的時候發現pop的數==輔助佇列的頭元素,則把輔助佇列頭個元素pop掉,這樣只有pop掉4後才會把輔助陣列的4給pop掉,具體**如下:
1void
pop()27
que.pop_front();8}
完整的類如下:
class queueque.pop_front(); }
void push(const int &x)
int maxelement()
private:
dequeque,buf_que;
};
劍指Offer 查詢佇列中的最大值
題目描述 給定乙個陣列和滑動視窗k的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為 針對陣列的滑動視窗有以下6個 分別找出這6個滑動視窗中的最大值,並儲存到乙個列表中。最簡單的思路就是分別找到這些滑動視窗,並用乙個陣列來儲存,...
如何在 Linux 中查詢乙個檔案
對於新手而言,在 linux 中使用命令列可能會非常不方便。沒有圖形介面,很難在不同資料夾間瀏覽,找到需要的檔案。本篇教程中,我會展示如何在 linux 中查詢特定的檔案。第一步要做的是通過 ssh 連線到你的 linux 在 linux 中查詢檔案有兩種方法。一種是使用find命令,另外一種是使用...
佇列中取最大值操作問題
1 利用棧中o 1 的時間複雜度取最大值的思路,使用兩個棧構建乙個佇列 2 然後取出兩個棧中的較大者即為佇列的最大值。include include include using namespace std class satckmax else void pop datastack.pop maxs...