lc907.子数组的最小值之和

 

题目链接

可以看作单调栈来解决。

这个算法的时间复杂度是O(N),空间复杂度是O(N)。

python:

class Solution:
    def sumSubarrayMins(self, arr: List[int]) -> int:
        res = 0
        arr = arr + [0]
        stack = [-1]
        size = len(arr)
        for i in range(size):
            while arr[stack[-1]] > arr[i]:
                idx = stack.pop()
                res += arr[idx] * (idx - stack[-1]) * (i - idx)
            stack.append(i)
        return res % (10 ** 9 + 7)