2302 - Count Subarrays With Score Less Than K (Hard)
Problem Link
https://leetcode.com/problems/count-subarrays-with-score-less-than-k/
Problem Statement
The score of an array is defined as the product of its sum and its length.
- For example, the score of is . Given a positive integer array and an integer , return the number of non-empty subarrays of whose score is strictly less than .
A subarray is a contiguous sequence of elements within an array.
Example 1:
Input: nums = [2,1,4,3,5], k = 10
Output: 6
Explanation: The 6 subarrays having scores less than 10 are:
- [2] with score 2 * 1 = 2.
- [1] with score 1 * 1 = 1.
- [4] with score 4 * 1 = 4.
- [3] with score 3 * 1 = 3.
- [5] with score 5 * 1 = 5.
- [2,1] with score (2 + 1) * 2 = 6.
Note that subarrays such as [1,4] and [4,3,5] are not considered because their scores are 10 and 36 respectively, while we need scores strictly less than 10.
Example 2:
Input: nums = [1,1,1], k = 5
Output: 5
Explanation: Every subarray except [1,1,1] has a score less than 5.
[1,1,1] has a score (1 + 1 + 1) * 3 = 9, which is greater than 5.
Thus, there are 5 subarrays having scores less than 5.
Constraints:
Approach 1: Sliding Window
In this approach we will maintain a sliding window from to , subarray starting with and ending at which has score less than . contains the current sum of element between the window.
We will start iterating from 0 to , first we will add to .
The current sum is denoted by and length is . If the score , the window is too big, we will remove and update i++. We continue doing this until the score is less than .
If we find a subarray to which has score less than , we will update answer as there will be total subarrays in total.
Time Complexity: , where is the size of array
Space complexity:
- C++
long long countSubarrays(vector<int>& nums, long long k) {
int n = nums.size();
long long sum = 0;
long long ans = 0;
int i = 0,j = 0;
while (j < n) {
sum += nums[j];
// increment j if score is less than k
if (sum * (j - i + 1) < k) {
ans += j - i + 1;
j++;
} else {
// go on incrementing i until score becomes less than k again
while (sum * (j - i + 1) >=k) {
sum -= nums[i];
i++;
}
ans += j - i + 1;
j++;
}
}
return ans;
}