如何在乙個佇列中查詢最大值

2022-02-19 17:53:57 字數 1474 閱讀 1205

程式設計之美上的題目,具體忘記了,有乙個佇列,定義了push,pop,maxelement三個函式,其中maxelement要返回佇列中最大的元素,第一次看這個題目就是遍歷,每次maxelement的時候遍歷一遍佇列,具體**不寫了,三個操作的開銷為:

1

push:o(

1)

2pop:o(

1)

3maxelement:o(length(que))

於是換成另外一種方法,設定乙個maxval,每次push與進入佇列的元素進行比較,這樣**如下:(為了節省篇幅,利用了stl)

1

intmain(

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,那麼就必須進行更新,三個操作的開銷分別為

1

push: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掉,具體**如下:

1

void

pop()27

que.pop_front();8}

完整的類如下:

class queue

que.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...