LeetCode 0795. 区间子数组个数

Posted Tisfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 0795. 区间子数组个数相关的知识,希望对你有一定的参考价值。

【LetMeFly】795.区间子数组个数

力扣题目链接:https://leetcode.cn/problems/number-of-subarrays-with-bounded-maximum/

给你一个整数数组 nums 和两个整数:leftright 。找出 nums 中连续、非空且其中最大元素在范围 [left, right] 内的子数组,并返回满足条件的子数组的个数。

生成的测试用例保证结果符合 32-bit 整数范围。

 

示例 1:

输入:nums = [2,1,4,3], left = 2, right = 3
输出:3
解释:满足条件的三个子数组:[2], [2, 1], [3]

示例 2:

输入:nums = [2,9,2,5,6], left = 2, right = 8
输出:7

 

提示:

  • 1 <= nums.length <= 105
  • 0 <= nums[i] <= 109
  • 0 <= left <= right <= 109

方法一:统计

题目中要找的是“最大元素在[left, right]范围内的子数组”

已知 r i g h t ≥ l e f t right \\geq left rightleft,因此“最大元素在[left, right]范围内的子数组”的数量,等于“最大元素不超过right的子数组数量” - “最大元素不超过left - 1的子数组数量”

因此,我们只需要实现一个函数,这个函数能够计算出“数组a中最大元素不超过b的子数组的数量”

怎么实现呢?

我们用一个变量来记录“上一个大于b的元素的位置”,当再次遇到“大于b的元素”时,二者之间的数组的所有非空子数组都是要找的数组。

假设两个“大于b的元素”之间有 k k k个元素,那么这 k k k个元素组成的非空子数组的个数就是 k × ( k + 1 ) / 2 k \\times (k + 1) / 2 k×(k+1)/2

问题解决。

  • 时间复杂度 O ( n ) O(n) O(n)
  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++

class Solution 
private:
    int noMoreThan(vector<int>& a, int b)   // a中的 “所有元素都不大于b 的子数组的个数”
        int ans = 0;
        int lastLoc = -1;
        int n = a.size();
        for (int i = 0; i <= n; i++) 
            if (i == n || a[i] > b) 
                ans += (long long)(i - lastLoc - 1) * (i - lastLoc) / 2;
                lastLoc = i;
            
        
        return ans;
    
public:
    int numSubarrayBoundedMax(vector<int>& nums, int left, int right) 
        return noMoreThan(nums, right) - noMoreThan(nums, left - 1);
    
;

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/128021990

以上是关于LeetCode 0795. 区间子数组个数的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode-795区间子数组个数

LeetCode 795 区间子数组个数[双指针 滑动窗口] HERODING的LeetCode之路

LeetCode﹝前缀和ி﹞一维二维前缀和应用

LeetCode 1662. 检查两个字符串数组是否相等 / 795. 区间子数组个数 / 剑指 Offer 47. 礼物的最大价值

HDU4622:Reincarnation(后缀数组,求区间内不同子串的个数)

leetcode中等2080区间内查询数字的频率