I have a working solution for the problem below. I have the feeling that it could be improved using memoization, but I cannot see how to do it.
The problem:
You are given an array arr of N integers. For each index i, you are required to determine the number of contiguous subarrays that fulfill the following conditions: The value at index i must be the maximum element in the contiguous subarrays, and These contiguous subarrays must either start from or end on index i.
Signature
int[] countSubarrays(int[] arr)
Input
Array arr is a non-empty list of unique integers that range between 1 to 1,000,000,000 Size N is between 1 and 1,000,000
Output
An array where each index i contains an integer denoting the maximum number of contiguous subarrays of arr[I]
Example:
arr = [3, 4, 1, 6, 2]
output = [1, 3, 1, 5, 1]
Explanation:
For index 0 - [3] is the only contiguous subarray that starts (or ends) with 3, and the maximum value in this subarray is 3.
For index 1 - [4], [3, 4], [4, 1]
For index 2 - [1]
For index 3 - [6], [6, 2], [1, 6], [4, 1, 6], [3, 4, 1, 6]
For index 4 - [2]
So, the answer for the above input is [1, 3, 1, 5, 1]
My solution (Is it O(n^2) time complexity?):
function countSubarrays(arr) {
// Write your code here
if(arr.length === 0) return [];
if(arr.length === 1) return [1];
const checkLeft = (index) => {
let count = 0;
for(let i=index-1; i>=0; i--) {
if(arr[i] < arr[index]) {
count++;
} else
break;
}
return count;
}
const checkRight = (index) => {
let count = 0;
for(let i=index+1; i<arr.length; i++) {
if(arr[i] < arr[index]) {
count++;
} else
break;
}
return count;
}
const output = [];
for(let i=0; i<arr.length; i++) {
output.push(1 + checkLeft(i) + checkRight(i))
}
return output;
}