# 795. Number of Subarrays with Bounded Maximum

795. Number of Subarrays with Bounded Maximum

We are given an array A of positive integers, and two positive integers L and R (L <= R).

Return the number of (contiguous, non-empty) subarrays such that the value of the maximum array element in that subarray is at least L and at most R.

Example :

Input:
A = [2, 1, 4, 3]
L = 2
R = 3
Output: 3

Explanation:

There are three subarrays that meet the requirements: [2], [2, 1], [3].

Note:

L, R and A[i] will be an integer in the range [0, 10^9].
The length of A will be in the range of [1, 50000].

  遍历数组,将遍历的元素分为下列三种情况来讨论:
①:if(A[i] >= L && A[i] <= R)
  在这种情况下,子数组的种类res += i - j + 1。即每添加一个满足①条件的点子列的情况就增加 i - j + 1种(j为当前子数组的开头,i为当前子数组的结尾,注意A[j]严格满足A[j] >= L && A[j] <= R)同时记录此时的子列长度countnums= i - j + 1。
②:else if(A[i] < L)
  此时新加的可能情况为res = res + countnums;注意此时的A[i]实际上是比给定的范围要小的点,是不满足题意的,但是如果它之前的countnums不为0,说明最近一次的子列加上该点也可以构成新子列,但是必须以countnums中的子列(该子列中的最后一个元素为A[j]严格满足A[j] >= L && A[j] <= R)中的某个元素为开始,以A[i]为结尾)。
A[i]>R
  此时意味着一个旧子列的结束,更新各个对应的参数

class Solution {
public:
    int numSubarrayBoundedMax(vector<int>& A, int L, int R) {
        int size = A.size();
        int countnums = 0;
        int res = 0;
        int j = 0;
        for(int i = 0; i<size; i++)
        {
            if(A[i] >= L && A[i] <= R)
            {
                res += i - j + 1;
                countnums = i - j + 1;
            }
            else if(A[i] < L)
            {
                res = res + countnums;
            }
            else
            {
                j = i + 1;
                countnums = 0;
                if(j > size)
                {
                    break;
                }
            }
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值