[leetcode] 795. Number of Subarrays with Bounded Maximum

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w5688414/article/details/90141371

Description

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:

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

分析

题目的意思是:给你一个数组,然后找出一个子数组,其中子数组的最大值不小于L,不大于R,问这样的子数组有多少个。

  • 看数组[2, 1, 4, 3]的最大值在[-∞, 4]范围内的子数组的个数。当遍历到2时,只有一个子数组[2],遍历到1时,有三个子数组,[2], [1], [2,1]。当遍历到4时,有六个子数组,[2], [1], [4], [2,1], [1,4], [2,1,4]。当遍历到3时,有十个子数组。其实如果长度为n的数组的最大值在范围[-∞, x]内的话,其所有子数组都是符合题意的,而长度为n的数组共有n(n+1)/2个子数组,刚好是等差数列的求和公式。
  • 当遍历到的数字大于等于L时,right赋值为当前位置i,那么每次res加上right - left,随着right的不停自增1,每次加上的right - left,实际上也是一个等差数列。当A[i]大于R的时候,left = i,那么此时A[i]肯定也大于等于L,于是rihgt=i,那么right - left为0,相当于上面的cur重置为0的操作.

代码

class Solution {
public:
    int numSubarrayBoundedMax(vector<int>& A, int L, int R) {
        int left=-1,right=-1;
        int res=0;
        for(int i=0;i<A.size();i++){
            if(A[i]>R) left=i;
            if(A[i]>=L) right=i;
            res+=right-left;
            
        }
        return res;
    }
};

参考文献

795. Number of Subarrays with Bounded Maximum
[LeetCode] Number of Subarrays with Bounded Maximum 有界限最大值的子数组数量

猜你喜欢

转载自blog.csdn.net/w5688414/article/details/90141371
今日推荐