问题:
给定一个数组A,求得连续元素组成子数组最大值在L和R之间的子数组个数。
Example : Input: A = [2, 1, 4, 3] L = 2 R = 3 Output: 3 Explanation: There are three subarrays that meet the requirements: [2], [2, 1], [3]. Note: L, R and A[i] will be an integer in the range [0, 10^9]. The length of A will be in the range of [1, 50000].
解法:
DP动态规划:每添加一个元素,可得新的子数组数为dp,要求的res+=dp即可。
动态转移方程:
dp[i]=
A[i] > R 的时候:0 (为了计算下面的情况,需要记录当前的 prev = i )
A[i] < L 的时候:dp[i-1]
L <= A[i] <= R 的时候:要把 这个数 和 之前连续(prev)的所有数 (i-prev)组成新的数组:i-prev
e.g: [1,2]+[3]->[1], [2], [1,2] + [3] ->
[1], [2], [1,2], +
([1,3]由于不连续,所以不能要) [2,3], [1,2,3], [3]
(i=2,prev=-1,dp=2-(-1)=3)
代码参考:
1 class Solution { 2 public: 3 int numSubarrayBoundedMax(vector<int>& A, int L, int R) { 4 int res=0,dp=0; 5 int i=0,prev=-1; 6 for(i=0; i<A.size(); i++){ 7 if(A[i]<L){ 8 res+=dp; 9 }else if(A[i]>R){ 10 prev=i; 11 dp=0; 12 }else{ 13 dp=i-prev; 14 res+=dp; 15 } 16 } 17 return res; 18 } 19 };
795. Number of Subarrays with Bounded Maximum
原文:https://www.cnblogs.com/habibah-chang/p/12864637.html