給定陣列 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 表示陣列 arr 的長度
第二行輸入 n 個整數 x
ix_i
xi,表示陣列 arr 中的每個元素
輸出描述:
輸出給定陣列中滿足條件的子陣列個數
示例1輸入
5 2
1 2 3 4 5
輸出12
備註:
1 ≤n
≤106
1 \leq n \leq 10^6
1≤n≤106−1
06≤a
rri≤
10
6-10^6 \leq arr_i \leq 10^6
−106≤a
rri
≤106
0 ≤n
um≤2
∗106
0 \leq num \leq 2*10^6
0≤num≤
2∗10
6題解:
此題的關鍵是怎麼確定子陣列內的最值,如果暴力枚舉子陣列,然後再遍歷子陣列找最值,時間複雜度為o(n
3)
o(n^3)
o(n3
),顯然不是想要的解法。考慮 生成視窗最大值陣列 一題,使用雙端佇列維護視窗內的最大值,時間複雜度為o(n
)o(n)
o(n)
,受此啟發,我們可以維護兩個雙端佇列來 實時更新 滑動視窗的最大值和最小值。如果全域性最大值和全全域性最小值都滿足條件,那麼滑動視窗中的任意子陣列也是滿足的。在計算子陣列數量時,每次只計算以滑動視窗的左邊界為起點的子陣列數量有多少,實際就是滑動視窗的長度。
**:
#include
#include
using
namespace std;
const
int n =
1000010
;int a[n]
;int q_min[n]
;int q_max[n]
;int h_min, t_min;
int h_max, t_max;
intmain
(void)if
(q_min[h_min]
== i)
++h_min;
if(q_max[h_max]
== i)
++h_max;
ret +
= j - i;
}printf
("%d\n"
, ret)
;return0;
}
最大值減去最小值小於或等於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 要求 o n 實現。思路 使用兩個有序佇列 相對於有序棧來命名 qmax和qmin,分別維護arr i.j 的最大值和最小值更新結構。當子陣列a i.j 向右滑動乙個位置變成arr ...
最大值減去最小值小於或等於num的子陣列數量
說明 本文是左程雲老師所著的 程式設計師面試 指南 第一章中 最大值減去最小值小於或等於num的子陣列數量 這一題目的c 復現。感謝左程雲老師的支援。題目 給定陣列 arr 和整數 num,共返回多少個字陣列滿足如下情況 max arr i.j min arr i.j num max arr i.j...