leetcode刷題筆記239

2021-10-13 17:13:48 字數 2018 閱讀 7898

這是一道hard的題目,但是我覺得沒有想象的那麼難,大概在中等難度,主要是要搞清楚一些東西,譬如優先順序佇列等,還有一點比較重要的需要搞清楚,我會在下邊提及,這道題不僅僅是讓我學到演算法,也讓我重視起對於stl的使用。

給你乙個整數陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 k 個數字。滑動視窗每次只向右移動一位。

返回滑動視窗中的最大值。

示例 1:

輸入: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 [-1 -3 5] 3 6 7 5

1 3 -1 [-3 5 3] 6 7 5

1 3 -1 -3 [5 3 6] 7 6

1 3 -1 -3 5 [3 6 7] 7

題目描述看起來有些長,總結就是,用乙個「方框」去套住陣列中的數字,把那個方框中最大的數作為結果壓入乙個vector,把這個「方框」依次往後移,直到把陣列中的每個數都遍歷一遍,得到的vector就是答案。

這道題很容易用暴力解法做,相信每乙個學過計算機程式語言的人都知道,只需要判斷出下標i到i+k之間的最大值,將其壓入vector即可,但是這樣做肯定是不行的,時間複雜度太高了。

因此需要一些改進,對於我本人的改進方法是:將每乙個「方框」中的數做成最大堆,這樣就能得出每個方框中的最大值,但是其實這樣與暴力解法完全一樣,都是判斷「方框」中的最大值並輸出,無非是我用了堆排序,快排還能更快呢。。。。這種想法是不可行的。

接著,我進一步的想法是,既然每次只移動乙個數字,我只需要將新加入的數字和要彈出的數字進行位置交換,然後從該位置開始調整,將整個堆調整成最大堆,這樣就得到了最大的元素,並且效率會更高。這種解法我認為是可行的,但是問題是,如何找到最大堆中要彈出數的位置,這個問題很棘手。因為做題少,我對一些技巧性地東西使用的不是的熟練,甚至一些api都要專門查一查。。。

想到這裡我的思路就卡住了,考慮到hard難度還是要尊重一下的,我看了官方題解,基本思路跟我的很像,也是使用了優先順序佇列,即最大堆,同樣是考慮到每次只有乙個數的出入,我的想法是將最前邊的數彈出,將新加入的數壓入,但是這樣是完全沒有必要的,比如這個例子:

數列:1 1 1 2 3 5

k=3前三個數是1 1 1,最大值是1,往後移一位是1 1 2,最大值是2,此時按照我的做法,整個最大堆裡邊只有1 1 2,但是其實就算第乙個1也在最大堆裡邊,也不會造成影響,不會導致結果出現問題。再往後走, 1 2 3,最大值為3,與1 1 1 2 3的最大值並無不同。

那麼什麼時候有問題呢?再舉乙個例子:

5 3 2 1 1 1

比如這個例子中,剛開始是 5 3 2,最大值為5,往後移是3 2 1,最大值是3,這時候就不能讓5存在於最大堆中,要把它彈出。

因此我們可以得到這樣的結論:當「方框「往後移動時,將新加入的數壓入最大堆,假如這時堆頂元素,即最大值是方框之外的元素,將其彈出,直到堆頂為方框內的元素,將其作為結果,而其他非堆頂的非」方框「內元素,不對結果造成任何影響。

在這種想法下就可以解出這道題,然而對於我還有乙個問題,對stl十分不熟悉。。。之前做的一道最大堆問題我都是自己寫的最大堆,現在最大堆倒是可以寫,但是關於判斷數的位置一籌莫展,直到看了答案,哦原來可以用pair,實在是妙,可惜我沒想起來。。。還是得多熟悉。同時也讓我知道了stl中優先順序佇列確實挺好用的。

原始碼如下:

class

solution

answer.

push_back

(p.top()

.first)

;for

(int i=k;isize()

;i++

) answer.

push_back

(p.top()

.first);}

return answer;}}

;

與題解很相似,沒辦法,畢竟是看了題解才知道怎麼實現的。

leetcode刷題之239 滑動視窗的最大值

正確的解法是使用雙端佇列來處理這個window的功能。c deque有現成的stl可以使用 需要注意幾個點 1.需要維護佇列內部的最大值在隊首的位置,每次想要新增乙個新元素的時候就迴圈和前面的元素做比較 2.判斷乙個元素是否過期,可以直接用當前隊首和應該淘汰的數字進行對比如果一致就去除 主要邏輯 1...

Leetcode刷題筆記

1.兩數之和給定乙個整數陣列nums 和乙個目標值target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。ps 你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。思路 用target減去nums中的每乙個數,並設立乙個字典來記錄對應的下標 class...

LeetCode刷題筆記

實現strstr 給定乙個 haystack 字串和乙個 needle 字串,在 haystack 字串中找出 needle 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。示例 1 輸入 haystack hello needle ll 輸出 2 示例 2 輸入 haystack aaaa...