# 2444. Count Subarrays With Fixed Bounds ###### tags: `leetcode` ## Description You are given an integer array nums and two integers `minK` and `maxK`. A fixed-bound subarray of nums is a subarray that satisfies the following conditions: - The minimum value in the subarray is equal to minK. - The maximum value in the subarray is equal to maxK. Return the number of fixed-bound subarrays. A subarray is a contiguous part of an array. - Example 1: >Input: nums = [1,3,5,2,7,5], minK = 1, maxK = 5 Output: 2 >>Explanation: The fixed-bound subarrays are [1,3,5] and [1,3,5,2]. - Example 2: >Input: nums = [1,1,1,1], minK = 1, maxK = 1 Output: 10 >>Explanation: Every subarray of nums is a fixed-bound subarray. There are 10 possible subarrays. - Constraints: >$2 \leq nums.length \leq 10^5$ $1 \leq nums[i], minK, maxK \leq 10^6$ ## Solution - This is a dynamic programming problem. The intuitive solving idea is to use let `dp[i]` as the **number of subarray that contains $nums[i]$** - In order to achieve this, keep an eye on the max and min of current subarray set, for the first one the construct looks that below ```cpp= // minSet, maxSet: the current subarray min and max index vector<int> minSet, maxSet; // dp: as described above, last: the overall answer, frontLine: the first one of the subarray long long int dp[nums.size()], frontLine = 0, last; // min and max are the same if (minK == maxK && nums[0] == minK) { dp[0] = 1; minSet.push_back(0); } else { dp[0] = 0; if (nums[0] == minK) minSet.push_back(0); else if (nums[0] == maxK) maxSet.push_back(0); else if (nums[0] < minK || nums[0] > maxK) frontLine++; } ``` - For each of the other numbers, possibilities are... 1. In the gap: the added combination is the last one of the array ```cpp= if (nums[i] > minK && nums[i] < maxK) dp[i] = dp[i - 1]; ``` 2. Out of the gap: recount the frontLine, and clean out the current subarray ```cpp= else if (nums[i] < minK || nums[i] > maxK) { frontLine = i + 1; minSet.clear(); maxSet.clear(); } ``` 3. It is `minK`: may be possible for the minK == maxK. give it an exception because it only counts to `minSet`. For the normal case, it will add the value from the begining of the array till the last maxSet value ```cpp= else if (nums[i] == minK) { if (minK == maxK) { if (minSet.empty()) dp[i] = 1; else dp[i] = i - minSet[0] + 1; } else if (!maxSet.empty()) dp[i] = maxSet.back() - frontLine + 1; else dp[i] = 0; minSet.push_back(i); } ``` 4. It is `maxK`: add the value from the begining of the array till the last minSet value ```cpp= else { if (!minSet.empty()) dp[i] = minSet.back() - frontLine + 1; else dp[i] = 0; maxSet.push_back(i); } ``` - Remember to add the `dp[i]` into the final answer