最大值減最小值滿足條件的子陣列

2021-10-18 18:56:30 字數 1046 閱讀 1918

求出乙個陣列中最大值減去最小值小於等於某個數的子陣列的個數o(n)時間複雜度

使用兩個雙端佇列結構,乙個用於維護當前子陣列中的最大值,乙個用於維護當前子陣列中的最小值

雙端佇列的維護詳見雙端佇列

首先我們需要知道一下結論:

如果乙個子陣列左端標記為l,右端標記為r,那麼:

(1)如果從l到r構成的子陣列可以滿足條件,則該子陣列中的任意乙個子陣列都滿足條件;

(2)如果從l到r構成的子陣列不滿足條件,則包含改陣列的任何乙個陣列都不滿足條件。

我們一次遍歷陣列的每乙個位置,當前位置記為l,r記為由當前位置可以構成的滿足條件的最長子陣列,則當由當前位置形成的滿足條件的子陣列個數為r-l;當無法以l形成滿足條件的子陣列時l++,並維護一下最大值和最小值的雙端佇列。

#include

#include

using

namespace std;

//最大值減去最小值小於或等於num的子陣列

intgetnum

(int arr,

int size,

int num)

minq.

push_back

(r);

while

(!maxq.

empty()

&& arr[maxq.

back()

]<= arr[r]

) maxq.

push_back

(r);

if(arr[maxq.

front()

]-arr[minq.

front()

]> num)

r++;}

res +

= r-l;

if(maxq.

front()

== l)

if(minq.

front()

== l)

l++;}

return res;

}int

main()

最大值 最小值

求最大最小的時候有點小技巧,就是我們兩個兩個的比較,把大個跟當前最大比較,小的跟當前最小的比較,這樣就會節約一點比較時間,有原來的2 n到3 n 2。include include 得到最大最小值 int getmaxmin int ndata,int nlen,int pnmax,int pnmi...

陣列取最大值最小值

1 陣列取出最大值,最小值的方式 第一種 遍歷一邊陣列就可以找出需要的值,基本上可以說是速度最快的演算法,還不需要排序 int intarray int max intarray 0 int min intarray 0 for int i intarray listl arrays.aslist ...

求陣列的最大值最小值

演算法陣列中的最大值和最小值 方法1 遍歷兩次求出最大值最小值 時間複雜度n 2 方法2 相鄰兩個數分為一組比較,大的放在偶數字,小的放到奇數字,然後在偶數字上找到最大值,在奇數字上找到最小值n 1.5 方法3 定義兩個變數max,min值,相鄰兩個數分為一組,比較出最大值和最小值,最大值和max比...