獲取視窗最大值陣列 O n 解法

2021-07-07 10:39:21 字數 1184 閱讀 2759

題目:

乙個整型陣列num 視窗大小w 從左到右滑動視窗。

視窗滑動過程中每次都會產生乙個最大值。【總共產生n - w + 1個視窗】

思路:常規解法:o(n*w)的解法複雜度太高。

本題解法複雜度:o(n) 大致思想如下:

維護乙個雙端佇列dq 記錄遍歷的元素下標。 記:num[i]為當前遍歷到的元素 dq隊尾元素為j。

若 num[i] < num[j] 將i放入隊尾   結束。【說明當前元素並沒有更新記錄的最大值下標】

若 num[i] >= num[j] 將j從隊首彈出  繼續比較。【說明當前元素的加入會更新最大值 此時需要多步操作更新最大值】

注意:如果隊首元素為i-w 那麼此時需要將隊首從佇列彈出,因為此時記錄的最大值下標已經不是當前w大小視窗的最大值。

貼**:

#include #include #include using namespace std;

void getwindowmax(vectornum, int w, vector&maxnum)

// 定義乙個雙端佇列 儲存陣列元素下標

dequedq; // 插入資料在隊尾操作 彈出資料在隊首操作

maxnum.resize(num.size() - w + 1, 0);

int idx = 0;

// 遍歷給定陣列num 找出w視窗內的最大值 放入maxnum陣列中

for (int i = 0; i < num.size(); ++i)

// 當前隊尾元素 < 當前陣列元素 => 將當前元素下標放入隊尾

dq.push_back(i);

// 下標過期 從隊首彈出即可

if (dq.front() == i - w)

if (i >= w - 1)

}}int main(void)

; int w = 3;

vectornum(a, a + 7);

vectorres;

getwindowmax(num, w, res);

if (res.empty() == false)

{ vector::iterator it;

for (it = res.begin(); it != res.end(); ++it)

{ cout<<(*it)<55

566

生成視窗最大值陣列

題目描述 有乙個整型陣列arr和乙個大小為w的視窗從陣列的最左邊滑到最右邊,視窗每次向右邊滑乙個位置,求每一種視窗狀態下的最大值。如果陣列長度為n,視窗大小為w,則一共產生n w 1個視窗的最大值 輸入描述 第一行輸入n和w,分別代表陣列長度和視窗大小 第二行輸入n個整數x,表示陣列中的各個元素 輸...

生成視窗最大值陣列

有乙個整型陣列arr和乙個大小為w的視窗從陣列的最左邊滑到最右邊,視窗每次向右邊滑乙個位置,求每一種視窗狀態下的最大值。如果陣列長度為n,視窗大小為w,則一共產生n w 1個視窗的最大值 輸入描述 第一行輸入 n 和 w 分別代表陣列長度和視窗大小 第二行輸入 n 個整數 x ix i xi 表示陣...

生成視窗最大值陣列

說明 本文是左程雲老師所著的 程式設計師面試 指南 第一章中 生成視窗最大值陣列 這一題目的c 復現。感謝左程雲老師的支援。題目 有乙個整形陣列 arr 和乙個大小為 w 的視窗從陣列的最左邊滑到最右邊,視窗每次向右邊滑動乙個位置。例如,陣列為 視窗大小為3時 4 3 5 4 3 3 6 7 視窗中...