2444.Count Subarrays With Fixed Bounds
===
###### tags: `Hard`,`Array`,`Queue`,`Sliding Window`
[2444. Count Subarrays With Fixed Bounds](https://leetcode.com/problems/count-subarrays-with-fixed-bounds/)
### 題目描述
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 <= `nums.length` <= 10^5^
* 1 <= `nums[i]`, `minK`, `maxK` <= 10^6^
### 解答
#### C++
##### 思路:
1. 找subarray符合最大值等於maxK, 最小值等於minK
2. 看constraint基本上為要求O(n)解法
3. 思考從0遍歷至index i時, 若為合法subarray, 則其前面必有maxK及minK出現, 而此時考慮可以新增的subarray個數為maxK跟minK取最遠的index, 跟不符合條件的index(boundary)做相減算合法的個數, 即為此次可新增的個數, 遍歷累加即可
4. 遍歷時紀錄maxK/minK/boundary index即可
```cpp=
class Solution {
public:
long long countSubarrays(vector<int>& nums, int minK, int maxK) {
long long res = 0;
int minKIndex = -1, maxKIndex = -1, boundary = -1;
for(int i = 0; i < nums.size(); i++)
{
if(nums[i] < minK || nums[i] > maxK)
{
boundary = i;
continue;
}
if(nums[i] == minK)
minKIndex = i;
if(nums[i] == maxK)
maxKIndex = i;
res += max(0, min(minKIndex, maxKIndex) - boundary);
}
return res;
}
};
```
Time: $O(n)$
Extra Space: $O(1)$
> [name=XD] [time= March 4, 2023]
### Reference
[回到題目列表](https://hackmd.io/@Marsgoat/leetcode_every_day)