佇列及其應用(滑動視窗求最大值)

2021-08-19 23:21:06 字數 2543 閱讀 2736

一、佇列(queue)

1、佇列的特點

佇列(queue)與棧一樣,是一種線性儲存結構,它具有如下特點:

【note】:

(1)佇列中的資料元素遵循「先進先出」(first in first out)的原則,簡稱fifo結構。

(2)在隊尾新增元素,在隊頭刪除元素。

佇列在棧在計算機中應用相當廣泛,包括廣度優先搜尋、cpu的作業排程、緩衝區等等。

2、佇列的相關概念

(1)隊頭( front() )與隊尾( back() ): 允許元素插入的一端稱為隊尾,允許元素刪除的一端稱為隊頭。

(2)入隊( push_back() ):佇列的插入操作。

(3)出隊( pop_front() ):佇列的刪除操作。

二、環形佇列

如果使用順序表作為佇列的話,當處於右圖狀態則不能繼續插入新的隊尾元素,否則會因為陣列越界而導致程式**被破壞。

由此產生了由鍊錶實現的迴圈佇列,只有佇列未滿時才可以插入新的隊尾元素,從而解決了無法判斷佇列是否溢位的問題。

(1)普通佇列判斷空或滿:front == rear, rear == max_size - 1;

(1)迴圈佇列判斷空或滿:front == rear, (rear + 1) % max_size == 0;

三、雙端佇列(deque)

雙端佇列是一種可以在兩端做插入和刪除操作的佇列,而且插入和刪除的速度很快;但是在內部進行插入和刪除操作,效能不及list。

(1)隊頭: front() , 隊尾:back()

(2)隊頭入隊:push_front() , 隊尾入隊:push_back()

(3)隊頭出隊: pop_front() , 隊尾出隊:pop_back()

四、佇列的應用之滑動視窗求最大值

有乙個整型陣列 arr 和乙個大小為 w 的視窗從陣列的最左邊滑到最右邊,視窗每次向右邊滑乙個位置。 返回乙個長度為n-w+1的陣列res,res[i]表示每一種視窗狀態下的最大值。 以陣列為[4,3,5,4,3,3,6,7],w=3為例。

因為第乙個視窗[4,3,5]的最大值為5,第二個視窗[3,5,4]的最大值為5,第三個視窗[5,4,3]的最大值為5。第四個視窗[4,3,3]的最大值為4。第五個視窗[3,3,6]的最大值為6。第六個視窗[3,6,7]的最大值為7。

所以最終返回[5,5,5,4,6,7]。

給定整形陣列arr及它的大小n,同時給定w,請返回res陣列。保證w小於等於n,同時保證陣列大小小於等於500。

測試樣例:

[4,3,5,4,3,3,6,7],8,3

返回:[5,5,5,4,6,7]

1、思路

我們用乙個雙向佇列deque來解決該問題。

1. 如果新來的值比佇列尾部的數小,那就追加到後面,因為它可能在前面的最大值劃出視窗後成為最大值。

2. 如果新來的值比尾部的大,那就刪掉尾部(因為有更大的在後面,所以它不會成為最大值,劃出也是它先劃出,不影響最大值),再追加到後面,迴圈下去保證次最大值總是緊鄰隊頭元素。

3. 如果追加的值比的索引跟佇列頭部的值的索引超過視窗大小,那就刪掉頭部的值

4. 其實這樣每次佇列的頭都是最大的那個。

2、demo

#include

using

namespace std;

vector<

int>

fun(

const vector<

int>

&vec,

const

int&n,

const

int&w)

}return res;

}int

main

(int argc,

char

const

*argv)

;int a =8;

int b =3;

vector<

int> v2 =

fun(v1, a, b)

;for

(const

auto v : v2)

cout << v << endl;

system

("pause");

return0;

}

滑動視窗的最大值 佇列的最大值

請定義乙個佇列並實現函式max得到佇列裡的最大值,要求函式max push back和 pop front的時間複雜度都是o 1 在佇列中維護乙個儲存最大值的佇列,當pop和push操作的同時也對最大值佇列進行維護。當彈出的時佇列中的最大值時,也彈出最大值佇列的頭,當壓入新值時,對最大值佇列從後向前...

滑動視窗最大值

題目描述 給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為 針對陣列的滑動視窗有以下6個 幾個注意點 利用雙端佇列實現,如果後者比前者大,前者丟擲,後者進,如果比前者小,壓入佇列,判斷隊頭是否過期,這就需...

滑動視窗最大值

給定乙個陣列和滑動視窗的大小,請找出所有滑動視窗裡的最大值。public class 滑動視窗的最大值 if num.length size size 1 用來儲存可能是滑動視窗最大值的數字的下標 linkedlist indexdeque newlinkedlist for int i 0 i s...