单调栈
单调栈裸题,计算每个元素对于答案的贡献。分别用两个数组记录元素的左右边界值l、r,由乘法原理可得每个元素arr[i]对于答案的贡献为arr[i]*(i-l)*(r-i),累加答案即可。要注意的细节是边界值的处理,要引入-1作为哨兵来处理边界情况。
class Solution {
public:
static const int mod=1e9+7;
int sumSubarrayMins(vector<int>& arr) {
stack<int> st;
arr.push_back(-1);
st.push(-1);
int n=arr.size();
long long ans=0LL;
for(int i=0;i<n;i++){
while(st.size()>1&&arr[st.top()]>=arr[i]){
int j=st.top();
st.pop();
ans+=1LL*arr[j]*(i-j)*(j-st.top())%mod;
}
st.push(i);
}
return ans%mod;
}
};
时间复杂度:O(n),每一个元素入栈出栈各一次。
空间复杂度:O(n)。