LeetCode 795.区间子数组个数

给定一个元素都是正整数的数组A ,正整数 L 以及 R (L <= R)。

求连续、非空且其中最大元素满足大于等于L 小于等于R的子数组个数。

例如 :
输入:
A = [2, 1, 4, 3]
L = 2
R = 3
输出: 3
解释: 满足条件的子数组: [2], [2, 1], [3].
注意:

L, R 和 A[i] 都是整数,范围在 [0, 10^9]。
数组 A 的长度范围在[1, 50000]。

## 方法1、遍历法(剪枝)
class Solution:
    def numSubarrayBoundedMax(self, A: List[int], L: int, R: int) -> int:
        ans = 0
        for start in range(len(A)):
            if A[start]>R:
                continue
            cur_max = A[start]
            for end in range(start,len(A)):
                cur_max = max(cur_max, A[end])
                if cur_max > R:
                    break
                if cur_max >= L:
                    ans += 1
        return ans

## 方法2、
## 最大值为R的子集的个数 - 最大值为L-1的子集个数
class Solution:
    def numSubarrayBoundedMax(self, A: List[int], L: int, R: int) -> int:
       def helper(A,max_value):
            ans = 0
            cur_ans = 0
            for i in range(len(A)):
                if A[i] <= max_value:
                    cur_ans+=1
                    ans+=cur_ans
                else:
                    cur_ans = 0
            return ans
        return helper(A, R) - helper(A, L-1)
posted @ 2019-07-24 19:47  机器狗mo  阅读(197)  评论(0编辑  收藏  举报