2023每日刷题(四十二)
Leetcode—907.子数组的最小值之和
算法思想
参考自y神思想
实现代码
class Solution {
public:
int sumSubarrayMins(vector<int>& arr) {
long long ans = 0;
const int mod = 1e9+7;
int n = arr.size();
stack<int> st;
vector<int> left(n, -1);
vector<int> right(n, n);
for(int i = 0; i < n; i++) {
int t = arr[i];
while(!st.empty() && arr[st.top()] >= t) {
st.pop();
}
if(!st.empty()) {
left[i] = st.top();
}
st.push(i);
}
st = stack<int>();
for(int i = n - 1; i >= 0; i--) {
int t = arr[i];
while(!st.empty() && arr[st.top()] > t) {
st.pop();
}
if(!st.empty()) {
right[i] = st.top();
}
st.push(i);
}
for(int i = 0; i < n; i++) {
ans += 1LL * (i - left[i]) * (right[i] - i) * arr[i] % mod;
ans %= mod;
}
return ans;
}
};
运行结果
之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!