Sum of Subarray Minimums

MediumArrayDynamic ProgrammingStackMonotonic Stack

Solution

export function sumSubarrayMins(arr: number[]): number {
  const N = arr.length;
  const MOD = 1_000_000_007;
  const stack: number[] = [];
  const dp: number[] = new Array(N).fill(0);
 
  for (let i = 0; i < N; i++) {
    while (0 < stack.length && arr[i] < arr[stack[stack.length - 1]]) {
      stack.pop();
    }
 
    if (0 < stack.length) {
      const smallerIndex = stack[stack.length - 1];
      dp[i] = dp[smallerIndex] + (i - smallerIndex) * arr[i];
    } else {
      dp[i] = (i + 1) * arr[i];
    }
    stack.push(i);
  }
 
  const answer = dp.reduce((prev, curr) => (prev + curr) % MOD, 0);
  return answer;
}