劍指offer系列53 滑動視窗的最大值

2022-04-03 02:12:28 字數 987 閱讀 9348

分兩步:

首先找到視窗內的內容,然後找到視窗內的最大值。

1

class

solution

16return

re;17

//求這幾個數中的最大值18}

19int findbig(const vector& num, unsigned int size, unsigned int

i)20

27return

big;28}

29 };

上面的解法是我自己想的,看了劍指offer,這個題是在棧與佇列這一節放的,也就是考點是棧與佇列。用上面的方法做時間複雜度是o(nk),但是用佇列的方法做複雜度可以到o(n),也就是說每次滑動視窗可以在o(1)裡找到最大值。

很大提高了效率,那麼怎麼做呢。首先要想到佇列這個資料結構,這個問題可以這樣考慮:

1.設計乙個佇列放視窗內的內容,滑動一下視窗,往佇列後面加元素,尾部插入

2.如果插入的這個結點比佇列中原來的結點的尾部(不從頭結點開始比較是因為頭結點存的是最大的元素)的一些元素大,則刪除這些尾部的元素,尾部刪除

3.如果頭結點存的值是已經滑過去的視窗的值,則刪掉。頭部刪除

通過以上分析,頭尾部都要操作,所以可以想到使用佇列。

然後就是如何用佇列實現這個問題:

1.對於不超過視窗長度的元素,只需要判斷1,2

2.對於後面的元素,需要判斷1,2,3

1

class

solution

17for (int i = size; i < len; i++)

1828

aux.push_back(i);29}

30re.push_back(num[aux.front()]);

31return

re;32

}33 };

這個題首先要想到合適的資料結構,然後如何用這個合適的資料結構將這個題表達出來。都是需要考慮到的。

劍指offer 滑動視窗問題

給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為 針對陣列的滑動視窗有以下6個 本人思路 每次滑動,總是減去乙個值,新增乙個值 如果新增值大於上乙個視窗的最大值,那麼新增值為本視窗的最大值 否則,如果上乙...

《劍指Offer》53 滑動視窗的最大值

題目 53.滑動視窗的最大值 知識點 雙端開口佇列 題目描述 給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為 針對陣列的滑動視窗有以下6個 解題思路 解法一和解法二的大致思路是相同的,通過觀察滑動視窗中...

劍指offer 滑動視窗最大值

很多題解都是用雙端佇列,但是既然是區間最值得問題,那麼可以用st表 唯一注意的是引數陣列的大小一定要大於視窗的大小,不然沒意義,即 中的len size的時候退出 果然還是引數的合法性一定要考慮,尤其是提示段錯誤的時候,而自己在本地測試沒問題,一般都是引數合法性的問題!一開始就是漏了這個條件,一直提...