import java.util.*; /** * NC407 区间子数组个数 * @author d3y1 */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型ArrayList * @param l int整型 * @param r int整型 * @return int整型 */ public int countSubarray (ArrayList<Integer> nums, int l, int r) { return solution(nums, l, r); } /** * 动态规划 * * dp[i]表示以第i个元素为结尾的最大元素在[l,r]范围内的连续子数组个数 * * 举例子找规律: * count表示当前元素前面连续小于l的元素个数 * * [l,r] => [9,13] * 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 * nums 15 9 7 1 3 15 7 12 15 14 4 5 9 13 * dp[i] 0 0 1 1 1 1 0 0 2 0 0 0 0 3 4 * count 0 0 0 1 2 3 0 1 0 0 0 1 2 0 0 * * { dp[i-1] , num<l * dp[i] = { dp[i-1] + 1 + count , l<=num && num<=r * { 0 , num>r * * @param nums * @param l * @param r * @return */ private int solution(ArrayList<Integer> nums, int l, int r){ int n = nums.size(); int[] dp = new int[n+1]; int num; int count = 0; for(int i=1; i<=n; i++){ num = nums.get(i-1); if(num < l){ dp[i] = dp[i-1]; count++; }else if(l<=num && num<=r){ dp[i] = dp[i-1] + 1 + count; count = 0; }else{ dp[i] = 0; count = 0; } } int result = 0; for(int i=1; i<=n; i++){ result += dp[i]; } return result; } }