題目:
乙個整型陣列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 視窗中...