Leetcode # 2444. Count Subarrays With Fixed Bounds
- 2023.09.05
- ★★★ Hard LeetCode Sliding Window
Problem
https://leetcode.com/problems/count-subarrays-with-fixed-bounds
fixed_bound_subarray :=
- nums[i:j]; 0 <= i, j < len(nums); i <= j
- min(fixed_bound_subarray) == minK
≡ (∀ num ∈ fixed_bound_subarray, num <= minK)
(∃ min_num ∈ fixed_bound_subarray, min_num == minK)
- max(fixed_bound_subarray) == maxK
Solution
nums[left] … (minK/maxK … maxK/minK) … nums[right]
- minK <= nums[i] <= maxK, for i in [left, right]
- (minK/maxK … maxK/minK): minK/maxK pair (
if last_max != -1 and last_min != -1:
)
There’s no other minK/maxK pair in (minK/maxK … maxK/minK) - nums[left] … minK/maxK:
min(last_min, last_max) - left + 1
- maxK/minK … nums[right]:
for right in range(len(nums)):
ex: minK = 0, maxK = 2
1101 ⇒ ×
11012 ⇒ 11012, 1012, 012 (3)
110121 ⇒ 110121, 10121, 0121 (3)
1101211 ⇒ 1101211, 101211, 01211 (3)
11012111 ⇒ 11012111, 1012111, 012111 (3)
110121110 ⇒ 110121110, 10121110, 0121110, 121110, 21110 (5)
1101211100 ⇒ 1101211100, 101211100, 01211100, 1211100, 211100 (5)
11012111003 ⇒ ×
Time Complexity: O(len(nums))
Space Complexity: O(1)
(The input and output generally do not count towards the space complexity.)
class Solution: def countSubarrays(self, nums: List[int], minK: int, maxK: int) -> int: ans = left = 0 last_max = last_min = -1 for right in range(len(nums)): if nums[right] > maxK or nums[right] < minK: left = right + 1 last_max = last_min = -1 else: if nums[right] == maxK: last_max = right if nums[right] == minK: last_min = right # update ans if last_max != -1 and last_min != -1: ans += min(last_min, last_max) - left + 1 return ans
Last Updated on 2023/09/06 by A1go