File tree Expand file tree Collapse file tree 1 file changed +33
-0
lines changed Expand file tree Collapse file tree 1 file changed +33
-0
lines changed Original file line number Diff line number Diff line change 1+ /*-------------------------------
2+ Time Complexity: O(n)
3+ Space Complexity: O(n)
4+ -------------------------------*/
5+ class Solution {
6+ public int sumSubarrayMins (int [] arr ) {
7+ int MOD = 1000000007 ;
8+ int res = 0 ;
9+ int [] extendedArr = new int [arr .length + 2 ];
10+
11+ for (int i = 0 ; i < arr .length ; i ++) {
12+ extendedArr [i + 1 ] = arr [i ];
13+ }
14+ extendedArr [0 ] = Integer .MIN_VALUE ;
15+ extendedArr [extendedArr .length - 1 ] = Integer .MIN_VALUE ;
16+
17+ Stack <int []> stack = new Stack <>(); // (index, num)
18+
19+ for (int i = 0 ; i < extendedArr .length ; i ++) {
20+ while (!stack .isEmpty () && extendedArr [i ] < stack .peek ()[1 ]) {
21+ int [] popped = stack .pop ();
22+ int j = popped [0 ];
23+ int m = popped [1 ];
24+ int left = j - (stack .isEmpty () ? -1 : stack .peek ()[0 ]);
25+ int right = i - j ;
26+ res = (int ) ((res + (long ) m * left * right ) % MOD );
27+ }
28+ stack .push (new int [] { i , extendedArr [i ] });
29+ }
30+
31+ return res ;
32+ }
33+ }
You can’t perform that action at this time.
0 commit comments