【leetcode】區間子數組個數--解析思路

leetcode 中國區開放了, 傳送門

該問題地址:點我去看看數組

問題描述

給定一個元素都是正整數的數組A ,正整數 L 以及 R (L <= R)。code

求連續、非空且其中最大元素知足大於等於L 小於等於R的子數組個數。ip

例如 :
輸入: 
A = [2, 1, 4, 3]
L = 2
R = 3
輸出: 3
解釋: 知足條件的子數組: [2], [2, 1], [3].

解題思路

根據條件 LR ,能夠把數字分爲三種,分別是 <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=3it

當遇到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

js代碼實現

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;
};
相關文章
相關標籤/搜索