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 <= nums.length <= 10^5
1 <= nums[i], minK, maxK <= 10^6
Solution
Solved after help…
Use a jbad
to keep track of the position that num < minK or num > maxK
, and jmin
denotes the position of minK
, jmax
denotes the position of maxK
.
For every A[i]
, the subarray ends with A[i]
, and starts with anywhere between [jbad + 1, min(jmax, jmin)]
.
Time complexity:
o
(
n
)
o(n)
o(n)
Space complexity:
o
(
1
)
o(1)
o(1)
Code
class Solution:
def countSubarrays(self, nums: List[int], minK: int, maxK: int) -> int:
jbad, jmin, jmax = -1, -1, -1
res = 0
for i in range(len(nums)):
if nums[i] == minK:
jmin = i
if nums[i] == maxK:
jmax = i
if nums[i] < minK or nums[i] > maxK:
jbad = i
res += max(0, min(jmin, jmax) - jbad)
return res