目錄1. 概述
有好幾種解法,比較常規的有2中,1是單調佇列,隊首存放最值。2是優先佇列,top也是存放的最值。
2. 優先佇列
class solution );
}vectorans = ;
for (int i = k; i < n; ++i) );
// ,出隊
while (q.top().second <= i-k)
ans.push_back(q.top().first);
}return ans;
}};
直接引用leetcode的題解,priority_queue,預設大根堆,裡面放pair, 因為滑動視窗移動的時候,要將index出界的刪除(pop),top存放最大值的值和索引。
先是進k個元素,然後迴圈的時候 入隊, 檢測top的index是否<= i-k ,成立的話pop(),將佇列的top的值放入vector。
3. 雙端佇列
class solution
q.push_back(i);
}// 第乙個值
vectorans= ;
for (int i = k; i < n; ++i)
q.push_back(i);
while (q.front()<= i-k)
ans.push_back(nums[q.front()]);
}return ans;
}};
deque裡面放索引,值可以通過索引來取值。
deque本身是單調遞減的,隊首存放最大值,這是重點。
先是把k的最大值放到deque裡面去,當第乙個值,
然後處理[k,n-1]的值,如果nums[i] 大於隊尾的值,則將隊尾元素出棧。
然後再檢測隊首的索引有沒有出界 i-k,如果出界,就隊首出棧。最後將隊首取出來,拿到元素,放入結果集中。
滑動視窗最大值
題目描述 給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為 針對陣列的滑動視窗有以下6個 幾個注意點 利用雙端佇列實現,如果後者比前者大,前者丟擲,後者進,如果比前者小,壓入佇列,判斷隊頭是否過期,這就需...
滑動視窗最大值
給定乙個陣列和滑動視窗的大小,請找出所有滑動視窗裡的最大值。public class 滑動視窗的最大值 if num.length size size 1 用來儲存可能是滑動視窗最大值的數字的下標 linkedlist indexdeque newlinkedlist for int i 0 i s...
滑動視窗最大值
給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 k 個數字。滑動視窗每次只向右移動一位。返回滑動視窗中的最大值。示例 輸入 nums 1,3,1,3,5,3,6,7 和 k 3 輸出 3,3,5,5,6,7 解釋 滑動視窗的位置 最大...