280. 239. 滑動窗口中位數(shù)/最大值 | 滑動窗口系列

分析:
? 這題最直觀的解法,就是在數(shù)組中對窗口內(nèi)的數(shù)字進行排序,然后計算中位數(shù):

? 但是,暴力解法永遠面臨的一個問題就是時間復(fù)雜度過大,因此我們就需要針對窗口的刪除、添加元素和排序進行優(yōu)化。
? 首先肯定不能在窗口移動的時候進行排序,這樣會浪費大量的時間,因此我們先在循環(huán)外部排好序,然后在每次窗口移動的時候,移除最左邊的元素,往最右邊添加一個元素。接著,對添加進來的元素進行排序,使窗口數(shù)組仍然有序。
? 因為vector已經(jīng)是有序數(shù)組,所以不能直接刪除第一個元素,而是要找到與nums[left]相同的那個元素,left指向的元素才是窗口最左邊的元素。這里可以用二分查找法來找到這個元素,然后刪除。

? 刪除掉窗口最左邊元素后,我們將新的元素添加進窗口,同時使窗口數(shù)組保持有序。這里可以直接用插入排序來插入新元素。在這題中,因為只需要插入一個元素,所以插入排序是優(yōu)于快速排序的。

? 注意:
這里有個編譯器上的坑,在vsCode等本地編譯器上,當vector.size()=0的時候,調(diào)用vector.back()還是會返回一個數(shù)字,但是在力扣中國的編譯器上,會提示錯誤,因此我們需要加入一個條件,判斷當窗口為空的時候,直接添加元素。

? 除此之外,官方給出的標準答案是使用雙堆來解題,以及c++獨有的STL容器中的多重集合。
參考答案:
https://leetcode-cn.com/problems/sliding-window-median/solution/hua-dong-chuang-kou-zhong-wei-shu-by-leetcode/


? 這題和280是一樣的,只需要把判斷條件換成取最大值即可,即 res.push_back(window.back());
? 不過題目有個額外要求,就是看能不能把時間復(fù)雜度降到O(N), 我們之前的方法復(fù)雜度至少是O(NlogN),要降到O(N)一般都是使用動態(tài)規(guī)劃來解答。