leetcode 滑動視窗最大 (239)

2021-09-26 20:01:50 字數 1294 閱讀 4955

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

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

示例:輸入: 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

用c實現有點費勁,沒有一些可用的庫,所有都需編寫**實現,**部分所post的**並非最優**,其閱讀起來比較費勁,leetcode上有一些簡潔的**,可以自行了解(在閱讀其他人**時建議關注演算法本身,因為我在leetcode平台上執行他人**時執行失敗,但其演算法實現方式值得借鑑),post的**主要思路如下:通過乙個windows(其實是陣列,為防止越界,採用頭節點start和record節點進行陣列的迴圈使用)來記錄每次視窗滑動的情況,記錄本著如下原則:

整個過程中會記錄,若遇到新的值不小於windows[start]對應的資料(該資料其實是max值,因為windows中的資料其實是按照從大到小排列的),則已在windows中記錄的資料沒有必要存在,因為後續的視窗最大值一定不小於該新的值,此時windows清空,只記錄新的值即可

整個過程中會記錄,若遇到新的值不大於windows[start]對應的資料,則當windows中前面的資料移出後,有可能該新的值為後續視窗的最大值,因此該型別值需要記錄到windows中,記錄時從windows的start處開始查詢合適位置一邊windows中的記錄按從大到小排列。

需要考慮的特殊情況:

1.輸入引數的合法性

2.在進行新的值與windows[start]對應的資料比較時,需要先判斷windows[start]對應的資料是否需要移出視窗,若需要則先移出再判斷

3.對一些新的值與windows中的值相同時,需要考慮該如何處理,注意上面段落中加粗字型的標註

4.輸入陣列的大小和視窗大小的關係要格外注意,leetcode中有些**沒考慮該項,否則在視窗滑動次數判斷上會出現異常

**注意點:

post出來的**比較繁瑣,而且**中有些變數可以省略

#define window_size 10240

/**

leetcode 滑動視窗最大值

如果只是想做大這件事件非常簡單,在每一段都取max即可,但是顯然這樣當k n 2 的時候不符合線性時間複雜度的要求,所以我們維護乙個列表,放其中的k個數字,然後沒加入乙個新的數字的時候都對其做一定的判斷,將不滿足條件的元素變為false,然後pop掉最前面的元素以及前面的所有false,然後非常容易...

leetcode 滑動視窗最大值

給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 k 個數字。滑動視窗每次只向右移動一位。返回滑動視窗中的最大值。高階 示例 輸入 nums 1,3,1,3,5,3,6,7 和 k 3輸出 3,3,5,5,6,7 解釋 滑動視窗的位置 ...

最大滑動視窗

題目描述 給定乙個陣列a,有乙個大小為w的滑動視窗,該滑動視窗從最左邊滑到最後邊。在該視窗中你只能看到w個數字,每次只能移動乙個位置。我們的目的是找到每個視窗w個數字中的最大值,並將這些最大值儲存在陣列b中。例如陣列a 1 3 1 3 5 3 6 7 視窗大小w為3。則視窗滑動過程如下所示 wind...