class Solution {
public:
int sumSubarrayMins(vector<int>& arr) {
long long ans = 0;
vector<int>left(arr.size()), right(arr.size());
vector<int>vstack;
for (int i = 0; i < arr.size(); i++) {
while (!vstack.empty() && arr[vstack.back()] > arr[i])
vstack.pop_back();
left[i] = (vstack.empty() ? -1 : vstack.back());
vstack.push_back(i);
}
vstack.clear();
for (int i = arr.size() - 1; i > -1; i--) {
while (!vstack.empty() && arr[vstack.back()] >= arr[i])
vstack.pop_back();
right[i] = (vstack.empty() ? arr.size() : vstack.back());
vstack.push_back(i);
}
long long mod = 1e9 + 7;
for (int i = 0; i < arr.size(); i++){
ans = (ans+(long long)(i - left[i]) * (right[i] - i)*arr[i])%mod;
}
return ans;
}
};
LeetCode 907. 子数组的最小值之和
最新推荐文章于 2024-07-13 13:36:16 发布