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

2021-09-05 13:07:02 字數 1358 閱讀 1197

給定陣列arr和整數num,返回共有多少個子陣列滿足如下情況:

max(arr[i..j]) - min(arr[i..j]) <= num

要求:o(n)實現。

思路:

使用兩個有序佇列(相對於有序棧來命名)qmax和qmin,分別維護arr[i..j]的最大值和最小值更新結構。

當子陣列a[i..j]向右滑動乙個位置變成arr[i..j+1]時,qmax和qmin可以在o(1)時間更新(上面已經分析,平均

來看的確是o(1)),並且可以在o(1)時間得到arr[i..j+1]的最大值和最小值。

步驟是這樣的:i,j 從0開始,首先 j 向右滑動,這個過程中維護arr[i..j]的最大值和最小值更新結構,同時觀察

(max-min)的值,當其大於num時,停止 j,此時,arr[i..j] 內以 i 為起始滿足條件的子陣列有 j - i 個;

然後 i 向右滑動一位,繼續上訴過程,直到 i 到達陣列末尾。

//若l~r滿足條件  則在l~r之間 所有以l開頭的子陣列都滿足條件

public int getnum(int arr, int num)

//qmax和qmin,分別維護arr[i..j]的最大值和最小值更新結構

linkedlistqmax = new linkedlist<>(); //降序 頭最大

linkedlistqmin = new linkedlist<>(); //公升序 頭最小

int l = 0, r = 0;

int res = 0;

while (l < arr.length)

qmax.addlast(r);

//最小值結構更新

while (!qmin.isempty() && arr[qmin.peeklast()] >= arr[r])

qmin.addlast(r);

//不達標情況

if (arr[qmax.peekfirst()] - arr[qmin.peekfirst()] > num)

r++;

}//判斷最大最小值過期了沒

if (qmax.peekfirst() == l)

qmax.pollfirst();

if (qmin.peekfirst() == l)

qmin.peekfirst();

res += r - l; //獲得所有以l開頭的子陣列的數量

l++; //換乙個開頭

}return res;

}

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

給定陣列arr和整數num,共返回有多少個子陣列滿足如下情況 max arr i j min arr i j num mar arr i j 表示陣列arr i j 中的最大值,min arr i j 表示子陣列arr i j 中的最小值。如果陣列長度為n,請事先時間複雜度為 o n 的解法。具體思...

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

給定陣列 arr 和整數 num,共返回有多少個子陣列滿足如下情況 max arr i j min arr i j num max arr i j 表示子陣列arr i j 中的最大值,min arr i j 表示子陣列arr i j 中的最小值。輸入描述 第一行輸入兩個數 n 和 num,其中 n...

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

說明 本文是左程雲老師所著的 程式設計師面試 指南 第一章中 最大值減去最小值小於或等於num的子陣列數量 這一題目的c 復現。感謝左程雲老師的支援。題目 給定陣列 arr 和整數 num,共返回多少個字陣列滿足如下情況 max arr i.j min arr i.j num max arr i.j...