(筆試題)滑動視窗的最大值

2021-09-08 10:56:52 字數 1314 閱讀 9044

給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。

例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為;

針對陣列的滑動視窗有以下6個:

, , , , , 。

假設視窗大小為w,

遍歷陣列,從陣列第w-1位開始,每次移動一位,並計算視窗w的最大值。

時間複雜度:

計算視窗的最大值需o(w),移動n-w+1次,時間複雜度為o(nw)

構建乙個視窗w大小的最大堆,每次從堆中取出視窗的最大值,隨著視窗往右滑動,需要將堆中不屬於視窗的堆頂元素刪除。

時間複雜度:

正常情況下,往堆中插入資料為o(lgw),如果陣列有序,則為o(lgn),因為滑動過程中沒有元素從堆中被刪除,滑動n-w+1次,複雜度為o(nlgn).

最大堆解法在堆中儲存有冗餘的元素,比如原來堆中元素為[10 5 3],新的元素為11,則此時堆中會儲存有[11 5 3]。其實此時可以清空整個佇列,然後再將11加入到佇列即可,即只在佇列中保持[11]。使用雙向佇列可以滿足要求,滑動視窗的最大值總是儲存在佇列首部佇列裡面的資料總是從大到小排列。當遇到比當前滑動視窗最大值更大的值時,則將佇列清空,並將新的最大值插入到佇列中。如果遇到的值比當前最大值小,則直接插入到佇列尾部。每次移動的時候需要判斷當前的最大值是否在有效範圍,如果不在,則需要將其從佇列中刪除。由於每個元素最多進隊和出隊各一次,因此該演算法時間複雜度為o(n)。

1、簡單方法:

int getmax(const

int a,int

size)

return

mx;}

vector

maxinwindows(const

int a,int n,int

size)

return

result;

}

2、最大堆、雙佇列方法

class

solution

result.push_back(p.first);

}return

result;

}//雙向佇列實現,複雜度o(n)

vector

maxinwindows(const vector &num, unsigned int

size)

for (int i = size; i < num.size(); i++)

result.push_back(num[q.front()]);

return

result;

}};

滑動視窗最大值

題目描述 給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小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 解釋 滑動視窗的位置 最大...