給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 k 個數字。滑動視窗每次只向右移動一位輸入: nums = [1,3,-1,-3,5,3,6,7], k = 3
輸出: [3,3,5,5,6,7]
滑動視窗的位置
最大值[1 3 -1]
-3 5 3 6 7
31[3 -1 -3]
5 3 6 7
31 3[-1 -3 5]
3 6 7
51 3 -1[-3 5 3]
6 7
51 3 -1 -3[5 3 6]
7
61 3 -1 -3 5[3 6 7]
7
此處使用雙向佇列(deque)這個資料結構
當前滑動視窗的最大值總是儲存在隊頭,佇列裡資料從大到小排列
若遇到的值比隊尾元素大,則將從隊尾開始比該值小的元素出隊,再將新值插入隊尾中
若遇到的值比當隊尾元素小,則直接插入到隊尾
每次移動的時,判斷隊頭元素(視窗最大值)是否在有效範圍.若不在,將其從佇列中刪除
num = [1,3,-1,-3,5,3,6,7] ,k = 3
原始陣列
佇列res
1
3 -1 -3 5 3 6 7
113
-1 -3 5 3 6 7
31 3-1
-3 5 3 6 7
3,-1
31 3 -1-3
5 3 6 7
3,-1,-3
3,31 3 -1 -35
3 6 7
53,3,5
1 3 -1 -3 53
6 7
5,33,3,5,5
1 3 -1 -3 5 36
7
63,3,5,5,6
1 3 -1 -3 5 3 67
7
3,3,5,5,6 ,7
原始陣列
佇列res
2
3 4 2 6 2 5 1
223
4 2 6 2 5 1
32 34
2 6 2 5 144
2 3 42
6 2 5 1
4,24,4
2 3 4 26
2 5 1
64,4,6
2 3 4 2 62
5 1
6,24,4,6,6
2 3 4 2 6 25
1
6,54,4,6,6,6
2 3 4 2 6 2 51
5,1
4,4,6,6,6,5
最後一行:隊頭6由於已經不在視窗範圍內故刪除
//v:待處理元素;w:視窗大小
vector<
int>
maxslidewindow
(vector<
int> v,
int w)
q.push_back
(i);
}for
(int i = w; i < v.
size()
; i++
)//當隊頭元素(最大值)不在視窗範圍內時刪除隊頭元素
while
(!q.
empty()
&& q.
front()
<= i-w)
q.push_back
(i);
} res.
push_back
(v[q.
front()
]);return res;
}
個人感覺難點在於刪除隊頭元素(最大值)這一部分,下面在進行說明
對於第i個元素,若其是當前視窗的最大值,那麼其有效的範圍為[i-w+1,i]
元素 :2 3 4 2 6 2 5 1
下標 :0 1 2 3 4 5 6 7
從第三個元素4開始:
滑動視窗最值
滑動視窗最值問題 給定乙個陣列 nums 和滑動視窗的大小 k,請找出所有滑動視窗裡的最大值。示例 輸入 nums 1,3,1,3,5,3,6,7 和 k 3 輸出 3,3,5,5,6,7 解釋 滑動視窗的位置 最大值 1 3 1 3 5 3 6 7 3 1 3 1 3 5 3 6 7 3 1 3 ...
演算法 陣列 滑動視窗
閒著無聊開啟as擼個小演算法吧 給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為 針對陣列的滑動視窗有以下6個 public arraylistmaxinwindows int num,int size ...
滑動視窗(poj,線段樹維護區間最值)
現在有一堆數字共n個數字 n 10 6 以及乙個大小為k的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。例如 the array is 1 3 1 3 5 3 6 7 and k 3.輸入格式 輸入一共有兩行,第一行為n,k。第二行為n個數 輸出格式 輸出...