This approach uses a sliding window technique with two pointers to efficiently count the subarrays. As we iterate through the array, we maintain a range that tracks the valid subarrays containing both minK
and maxK
. When a valid subarray is found, we slide the window to find other subarrays that meet the criteria.
Time Complexity: O(n), where n is the length of nums, as we iterate through the array once.
Space Complexity: O(1), as we are using a fixed amount of space.
1#include <stdio.h>
2
3int countFixedBoundSubarrays(int* nums, int numsSize, int minK, int maxK) {
4 int left = -1, minPos = -1, maxPos = -1;
5 int count = 0;
6 for (int right = 0; right < numsSize; ++right) {
7 if (nums[right] < minK || nums[right] > maxK)
8 left = right;
9 if (nums[right] == minK)
10 minPos = right;
11 if (nums[right] == maxK)
12 maxPos = right;
13 count += (minPos > left && maxPos > left) ? (left + 1) : 0;
14 }
15 return count;
16}
17
18int main() {
19 int nums[] = {1, 3, 5, 2, 7, 5};
20 int result = countFixedBoundSubarrays(nums, 6, 1, 5);
21 printf("%d\n", result);
22 return 0;
23}
In this solution, we iterate over the array with a single loop. For each element, we determine if it's part of a valid subarray by checking if both minK
and maxK
have been encountered after the last invalid boundary. We maintain variables to track the most recent positions of minK
and maxK
, and a pointer to the last invalid position. The count of valid subarrays increases by the number of such subarrays ending at each valid position.
This approach uses a brute force method to count fixed-bound subarrays by examining all possible subarrays in the provided array. For each subarray, check if the minimum and maximum elements match minK
and maxK
respectively.
Time Complexity: O(n2) due to the nested loops for subarray examination.
Space Complexity: O(1) as it uses a fixed number of variables.
1#include <iostream>
2#include <vector>
3#include <climits>
4
5int countFixedBoundSubarrays(const std::vector<int>& nums, int minK, int maxK) {
6 int count = 0;
7 for (int i = 0; i < nums.size(); ++i) {
8 int minVal = INT_MAX, maxVal = INT_MIN;
9 for (int j = i; j < nums.size(); ++j) {
10 minVal = std::min(minVal, nums[j]);
11 maxVal = std::max(maxVal, nums[j]);
12 if (minVal == minK && maxVal == maxK) {
13 count++;
14 }
15 }
16 }
17 return count;
18}
19
20int main() {
21 std::vector<int> nums = {1, 3, 5, 2, 7, 5};
22 std::cout << countFixedBoundSubarrays(nums, 1, 5) << std::endl;
23 return 0;
24}
In this C++ brute force solution, we iteratively check all subarrays. For each subarray, we maintain and compare the minimum and maximum values with the required minK
and maxK
to ensure they are valid.