資料結構與演算法a (第三章 棧與佇列 練習題): 滑動視窗
對於最大最小值分別維護乙個優先佇列(儲存元素下標)。以最小值為例。
每次遇到乙個新元素,從隊尾插入。插入時刪去佇列中比該值大的元素。(因為當前值出現的下標較晚,所以以後一定範圍視窗的最小值不會超過該值)。隊首是當前視窗的最小值。同時要注意維護隊首的下標是否在當前視窗內。
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int n, k, mmin, mmax;
int arr[1010000];
// priority_queue max_q;
// priority_queue, greater >min_q; // 存放當前視窗最大最小值
int min_q[1010000], max_q[1010000], min_left=0, min_right=0, max_left=0, max_right=0;
vector min_v;
vector max_v; // 存放最小值和最大值序列
int main()
min_q[min_right++] = i;
// 更新左邊下標在範圍之外的元素
while(min_q[min_left]
< i-k+1)
min_left++;
// 處理最大值佇列
while(max_right>max_left && arr[max_q[max_right-1]]q[max_right++] = i;
// 更新左邊下標在範圍之外的元素
while(max_q[max_left]
< i-k+1)
max_left++;
if(i >= k-1)
}// 初始化視窗
for(int i=0;i1;i++)
printf("\n");
for(int i=0;i1;i++)
return
0;}
POJ滑動視窗
現在有一堆數字共n個數字 n 10 6 以及乙個大小為k的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。例如 the array is 1 3 1 3 5 3 6 7 and k 3.輸入格式 輸入一共有兩行,第一行為n,k。第二行為n個數 輸出格式 輸出...
poj 2823 滑動視窗 單調佇列
poj2823 思路 最暴力的做法就是模擬過程,列舉每乙個長度為k的區間,然後遍歷一遍找最值,複雜度為n 2 這題n的範圍到了1e6 n 2 在規定時間內是跑不完的 所以這題要用資料結構優化 什麼樣的資料結構呢 對於當前區間為l到r 那麼往後移動了之後 區間變為了 l 1 到 r 1 也就是a l ...
佇列 單調佇列 滑動視窗
總時間限制 12000ms 記憶體限制 65536kb 描述給定乙個長度為n n 10 6 的陣列。有乙個大小為k的滑動視窗從陣列的最左端移動到最右端。你可以看到視窗中的k個數字。視窗每次向右滑動乙個數字的距離。下面是乙個例子 陣列是 1 3 1 3 5 3 6 7 k 3。視窗位置 最小值最大值 ...