LeetCode 795. Number of Subarrays with Bounded Maximum

问题链接

LeetCode 795

题目解析

给定一个数组A,左右范围L、R。求子数组的数量,要求:子数组最大值在L、R之间。

解题思路

子数组必须连续,利用最大值R对数组进行分段,设定变量 left 记录每段开始位置((A[left] > R)(A[left+1] ≤ R)),初始值为-1。

遍历数组,通过A[i]大小判断:

  • 若 A[i] 在L、R之间,则 ans+=(i-j);
  • 若 A[i] 大于R,则更改左界 left=i;
  • 关键在于处理小于L的情况,由于需要子数组的最大值在L、R之间,单纯的 A[i] 肯定不能算,需要知道最近合法的数字,即右界。设定变量 right 记录合法的数字的右界((L ≤ A[right] ≤ R)),当然,在A[i]大于R时,左界left和右界right都设置为i。这种情况下,ans += (i-left)-(i-right)。

参考代码

class Solution {
public:
    int numSubarrayBoundedMax(vector<int>& A, int L, int R) {
        int len = A.size();
        int ans = 0;
        int left = -1;//左界
        int right = -1;//最近合法位置
        for(int i=0; i<len; i++) {
            if(A[i] > R) {
                left = i;
                right = i;
            }
            else if(A[i]<L) {
                ans += (i-left)-(i-right);
            }
            else {
                ans += (i-left);
                right = i;
            }
        }
        return ans;
    }
};

LeetCode All in One题解汇总(持续更新中...)

本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.


原文地址:https://www.cnblogs.com/AlvinZH/p/8527214.html