leetcode 中國區開放了, 傳送門
該問題地址:點我去看看數組
給定一個元素都是正整數的數組A
,正整數 L
以及 R
(L <= R
)。code
求連續、非空且其中最大元素知足大於等於L
小於等於R
的子數組個數。ip
例如 : 輸入: A = [2, 1, 4, 3] L = 2 R = 3 輸出: 3 解釋: 知足條件的子數組: [2], [2, 1], [3].
根據條件 L
與 R
,能夠把數字分爲三種,分別是 <L
,>=L 且 <=R
以及 > R
。其中 >R
的數據不可能存在與符合條件(最大元素在 L R
之間)的子數組中,因此能夠把 >R
的數據看作一堵牆,全部的子數組不可能越過牆。leetcode
咱們先考慮沒有牆的狀況。get
假設L R
分別是2 3
。
假設給定數組[1,1,2,1,1]
。(爲了簡化問題,1
表明<L
的數,2
表明>=L 且 <=R
的數)
初始數量 c = 0
。
遍歷數組,遇到前兩個1
時,數量依然爲0
,當遇到2時,符合條件的子數組有[1,1,2],[1,2],[2]
,數量爲3
,與2
的處於低三個位置相對應。此時 c=3
。it
當遇到2
後面的1
時,新增的符合條件子數組有[1,1,2,1][1,2,1][2,1]
。
當遇到最後一個1
是,新增的符合條件子數組有[1,1,2,1,1][1,2,1,1][2,1,1]
。
新增的數量也與上一個2
的位置有關。io
再看個複雜點的例子。好比[1,2,1,2,1,1]
。
當遍歷到最後一個1
時,新增的數組爲[1,2,1,2,1,1] [2,1,2,1,1] [1,2,1,1] [2,1,1]
。
該數量與最後遇到的 2
的位置有關。ast
數組中存在牆的時候,能夠看作牆把數組分紅一個個子數組,在各個子數組中求子數組個數,最後加一塊兒便可。function
var numSubarrayBoundedMax = function(A, L, R) { var c_length = 0; // 記錄當前子數組遍歷到哪一個位置 var c_last_key_length = 0; // 記錄上一次遇到的 >=L 且 <=R 的數字位置 var c_sum = 0; // 記錄被牆分開的每段子數組的總和 var sum = 0; // 記錄總和 A.forEach(function(e){ if (e > R){ sum += c_sum; c_length = 0; c_last_key_length = 0; c_sum = 0; }else if (e < L){ c_length ++; c_sum = c_sum + c_last_key_length; } else{ c_length ++; c_last_key_length = c_length; c_sum += c_length; } }); sum += c_sum; return sum; };