***Leetcode 795. Number of Subarrays with Bounded Maximum

https://leetcode.com/problems/number-of-subarrays-with-bounded-maximum/description/

质量比较高的medium题了

主要参考的这里的思路https://leetcode.com/problems/number-of-subarrays-with-bounded-maximum/discuss/117612/C++-O(n)-solution-with-explanations/117551?page=1

比如2 1 3 4 5 , L=2, R=4

v == 2的时候,以2为开头的一个 head = 1

v == 1的时候,1不能作为开头,但是现在所有的已经获得的Subarray都可以添加一个数1组成新的subarray

所以ans += heads

v == 3的时候,3本身可以作为开头,从tail到3的子数组还可以作为开头,所以head += tails + 1, 所有已有的head加上3也都可以作为新的开头,所以ans += head 其实就是+= 之前的heads + tails + 1

v == 4的时候,之前所有的heads都可以和4结合成新的subarray 所以ans+= heads,v==3的时候,要对tails清零,因为当v == 4的时候,+=heads已经包含了从<L的数到4的情况。

class Solution {
public:
    int numSubarrayBoundedMax(vector<int>& A, int L, int R) {
        int ans = 0, heads = 0, tails = 0;
        for (int v : A) {
            if (L <= v && v <= R) {
                heads += tails + 1; //以v开头的1个sub,以v结尾的tails个
                ans += heads;
                tails = 0;
            } else if (v < L) {
                tails ++;
                ans += heads;
            } else {
                heads = 0;
                tails = 0;
            }
        }
        return ans;
    }
};





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值