zoukankan      html  css  js  c++  java
  • 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和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.


  • 相关阅读:
    JavaScript基础
    w3c网站案例
    CSS基础
    HTML基础
    MySQL--用户管理 pymysql 索引
    MySQL--高级
    MySQL--多表查询
    MySQL--单表查询
    直接插入排序与折半插入排序分析
    Nginx从安装到简单使用
  • 原文地址:https://www.cnblogs.com/AlvinZH/p/8527214.html
Copyright © 2011-2022 走看看