求出乙個陣列中最大值減去最小值小於等於某個數的子陣列的個數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比...