1. 题目描述
2. 解题方法
典型的单调栈使用,使用一个单调递增的栈来保存,栈中存放的是该元素之前包括该元素大于等于该元素的个数,使用一个total来表示以当前元素结尾的连续子数组的和。遍历该数组,不断的更新total,并将total值累加到结果中。
例如:数组 A = [1,7,5,2,4,3,9]
,当 i = 6
(A[i] = 9)时所有子序列的最小值为 B = [1,2,2,2,3,3,9]
,此时栈中存放的数值对是[(1,1),(2,3),(3,2),(9,1)],它们的点积和(total)即为以9结尾的l所有连续子数组的和。
代码
class Solution {
public:
int sumSubarrayMins(vector<int>& A) {
const int MOD = 1000000007;
int n = A.size();
struct node {
int v, c;
node(int _v, int _c) : v(_v), c(_c) {}
};
stack<node> st;
int ans = 0, total = 0;
for (int i = 0; i < n; i++) {
int _Count = 1;
while (!st.empty() && st.top().v >= A[i]) {
auto t = st.top();
st.pop();
_Count += t.c;
total -= t.v * t.c;
}
st.push(node(A[i], _Count));
total += A[i] * _Count;
ans += total;
ans %= MOD;
}
return ans;
}
};