題目:53. 滑動視窗的最大值
知識點:雙端開口佇列
題目描述:
給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為; 針對陣列的滑動視窗有以下6個: , , , , , 。
解題思路:
解法一和解法二的大致思路是相同的,通過觀察滑動視窗中數字的變化,我們可以發現其實每次滑動視窗的移動都是類似於乙個佇列,從右側新增元素,左側刪除元素,而且其實每次視窗中最大數字的判定就是判斷新進來的元素是否大於它,比如就像題目描述中的例子,第一次滑動視窗中的數字是2、3、4,最大的數字是4,當滑動視窗後移的時候,新進的元素為2,小於當前的滑動視窗中的最大元素,所以視窗中的最大元素不變仍未原值,當滑動視窗再次後移的時候,6進入視窗,它大於4因此此時的視窗最大值變為6。
其實通過這樣的觀察我們可以發現,首先我們對當前視窗的最大值進行儲存,之後假如入視窗的元素小於當前值,因為其有可能在當前最大值滑出時成為最大值,所以需要對其進行儲存,然後視窗滑動,當再進來的元素比剛剛儲存的那個元素大,也就說明剛剛儲存的那個元素其實永遠不可能成為視窗的最大值,所以其實可以將其刪除,再去判斷其儲存的前乙個元素,直到比較到不存在儲存的元素或者出現了比新要入窗的元素大的元素停止。
這樣的話我們其實可以使用乙個雙端開口的佇列來進行模擬,這樣做的好處是我們可以始終將視窗的最大值儲存在開頭處,然後每次新入窗的元素從隊尾向前進行比較,將小於它的元素全部從隊尾出列,然後將其入佇列,還有乙個需要考慮的問題就是當最大值已經滑出視窗時,我們需要即時的從隊頭將其刪除,這樣的話其實就是需要隊首隊尾都可以執行刪除操作,因此使用雙端開口佇列。
**:
//解法一(自研):
vectormaxinwindows(const vector& num, unsigned int size)
if(!indexs.empty())
res.push_back(num[indexs.front()]);
for(int i = size; i < num.size(); ++i)
return res;
}//解法二(劍指offer 思路同上)
vectormaxinwindows(const vector& num, unsigned int size)
for(unsigned int i = size; i < num.size(); ++i)
maxinwindows.push_back(num[index.front()]);
}return maxinwindows;
}
劍指offer53 矩形覆蓋
我們可以用21的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個21的小矩形無重疊地覆蓋乙個2 n的大矩形,總共有多少種方法?比如n 3時,2 3的矩形塊有3種覆蓋方法 實質上是斐波那契數列的思想。第乙個填滿,即豎著放的時候,還剩下f n 1 種放法。第乙個橫著放的時候,即兩個橫著放的時候,還剩下f ...
劍指offer系列53 滑動視窗的最大值
分兩步 首先找到視窗內的內容,然後找到視窗內的最大值。1 class solution 16return re 17 求這幾個數中的最大值18 19int findbig const vector num,unsigned int size,unsigned int i 20 27return bi...
劍指offer 滑動視窗問題
給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為 針對陣列的滑動視窗有以下6個 本人思路 每次滑動,總是減去乙個值,新增乙個值 如果新增值大於上乙個視窗的最大值,那麼新增值為本視窗的最大值 否則,如果上乙...