LeetCode 刷题系列 795. 区间子数组个数

题目

给定一个元素都是正整数的数组A ,正整数 L 以及 R (L <= R)。

求连续、非空且其中最大元素满足大于等于L 小于等于R的子数组个数。

例如 :
输入: 
A = [2, 1, 4, 3]
L = 2
R = 3
输出: 3
解释: 满足条件的子数组: [2], [2, 1], [3].
注意:

L, R  和 A[i] 都是整数,范围在 [0, 10^9]。
数组 A 的长度范围在[1, 50000]。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-subarrays-with-bounded-maximum
 

该题与 上一个 环绕字符串中的唯一的子数组属于同一个类型题: 前缀和

大神的解题思路在这里:https://leetcode-cn.com/problems/unique-substrings-in-wraparound-string/solution/xi-fa-dai-ni-xue-suan-fa-yi-ci-gao-ding-qian-zhui-/

思路

1. 假设有这样一个 函数,atMostK(nums,K) 可以求解在数组 nums中,元素最大值小于等于K 的连续子数组的个数。

2. 则 题目要求  最大元素满足大于等于L 小于等于R的子数组个数 = atMostK(nums,R) - atMostK(nums,L-1) (注意是L - 1, 因为要包含 元素 等于 L的情况)

3.  接下来想办法求解 atMostK, 在数组 nums中,元素最大值小于等于K 的连续子数组的个数

   背景:  一个子数组 [ 1 , 5 , 3 ] 的长度可以代表以 3 结尾的,子数组的个数。

   1)从数组 nums的第一个元素开始遍历,

      如果当前元素 nums[ i ] <= K ,则代表以 nums[ i ] 结尾的子数组个数为 ,记录到 pre中,并累加到最终结果里;

     否则,pre 值记为 0 。以当前元素为起点,继续计算

Java 代码如下:

class Solution {
public int numSubarrayBoundedMax(int[] nums, int left, int right) {
        int leftNum = atMostK(nums,left-1);
        int rightNum = atMostK(nums,right);
        return rightNum - leftNum;
    }
    public int atMostK(int[] nums,int K){
        int pre = 0;
        int ans = 0;

        for(int num:nums) {
            if(num<=K){
                pre++;
            } else {
                pre = 0;
            }
            ans+=pre;
        }
        return ans;
    }
}

你可能感兴趣的:(LeetCode)