Given an array of integers A
, find the sum of min(B)
, where B
ranges over every (contiguous) subarray of A
.
Since the answer may be large, return the answer modulo 10^9 + 7
.
Example 1:
Input: [3,1,2,4] Output: 17 Explanation: Subarrays are [3], [1], [2], [4], [3,1], [1,2], [2,4], [3,1,2], [1,2,4], [3,1,2,4]. Minimums are 3, 1, 2, 4, 1, 1, 2, 1, 1, 1. Sum is 17.
Note:
1 <= A.length <= 30000
1 <= A[i] <= 30000
思路:求每个数所有的subarray,分别求出能往左右2边能扩的距离,用单调栈来求
class Solution:
def sumSubarrayMins(self, a):
"""
:type A: List[int]
:rtype: int
"""
n=len(a)
left,right=[0]*n,[0]*n
st=[]
for i,v in enumerate(a):
while st and a[st[-1]]>v:
idx=st.pop()
right[idx]=i-idx
st.append(i)
while st:
idx=st.pop()
right[idx]=n-idx
a=a[::-1]
st=[]
for i,v in enumerate(a):
while st and a[st[-1]]>=v:
idx=st.pop()
left[idx]=i-idx
st.append(i)
while st:
idx=st.pop()
left[idx]=n-idx
left=left[::-1]
# print(left,right)
a=a[::-1]
res=0
mod=10**9+7
for i in range(n):
# print(left[i]*right[i], a[i])
res+=left[i]*right[i]*a[i]
res%=mod
return res