1. 程式人生 > >2pointer + 雙端佇列 計算區間max-min在一定範圍的子陣列個數

2pointer + 雙端佇列 計算區間max-min在一定範圍的子陣列個數

維護2個雙端佇列A,B。

A用來求滑動視窗的最大值,B最小值(這裡的視窗大小沒有限制)

假設我們視窗左邊從第1位開始,右邊擴到i位置時max-min大於給定的範圍,那我們繼續擴下去也沒有必要,因為:

視窗擴張後,當前視窗的max只會比之前視窗的max大,min比之前視窗的min小。

那這時就可以求出視窗左邊以第一位置開始的valid視窗的個數,就是視窗的寬度

接著左邊從第一位移到第二位,此時也一定是個合理的視窗,因為:

右邊擴不下去的時候,沒有進行擴,這是左邊右移一位,是之前的子視窗,max-min肯定滿足條件

接下來就是同樣的過程求以第2為開始的視窗的個數

。。。。。。

Notice:這是個sliding window(2 pointer,控制視窗大小)結合雙端佇列(求區間max/min)的神級題目啊