给定一个整数数组 A
,找到 min(B)
的总和,其中 B
的范围为 A
的每个(连续)子数组。
由于答案可能很大,因此返回答案模 10^9 + 7
。
示例:
输入:[3,1,2,4] 输出:17 解释: 子数组为 [3],[1],[2],[4],[3,1],[1,2],[2,4],[3,1,2],[1,2,4],[3,1,2,4]。 最小值为 3,1,2,4,1,1,2,1,1,1,和为 17。
提示:
1 <= A <= 30000
1 <= A[i] <= 30000
个人TLE答案 暴力法 就不发了 On3 丢人
拿第一的dalao(@cai_lw)的答案来分析一波 (以后
typedef long long ll;
class Solution {
const int P=1000000007;
public:
int sumSubarrayMins(vector<int>& a) {
int n=a.size();
vector<int> l(n,-1),r(n,n),st;
for(int i=0;i<n;i++){
while(!st.empty()&&a[st.back()]>a[i])st.pop_back();
if(!st.empty())l[i]=st.back();
st.push_back(i);
}
st.clear();
for(int i=n-1;i>=0;i--){
while(!st.empty()&&a[st.back()]>=a[i])st.pop_back();
if(!st.empty())r[i]=st.back();
st.push_back(i);
}
int ans=0;
for(int i=0;i<n;i++){
int d=r[i]-l[i]-1;
ans=(ll(ans)+ll(i-l[i])*ll(r[i]-i)*ll(a[i]))%P;
}
return ans;
}
};