题目地址:
https://leetcode.com/problems/sum-of-subarray-ranges/
给定一个长 n n n数组 A A A,求 ∑ l ≤ r ( max A [ l : r ] − min A [ l : r ] ) \sum_{l\le r}(\max A[l:r]-\min A[l:r]) ∑l≤r(maxA[l:r]−minA[l:r])。
参考https://blog.csdn.net/qq_46105170/article/details/109734115。代码如下:
class Solution {
public:
using LL = long long;
LL subArrayRanges(vector<int>& nums) {
auto less = [](int& x, int& y) { return x <= y; };
auto more = [](int& x, int& y) { return x >= y; };
return calc(nums, more) - calc(nums, less);
}
LL calc(vector<int>& v, bool (*comp)(int&, int&)) {
stack<int> stk;
LL res = 0;
for (int i = 0; i < v.size(); i++) {
while (stk.size() && comp(v[i], v[stk.top()])) {
int idx = stk.top(); stk.pop();
int l = idx - (stk.size() ? stk.top() : -1), r = i - idx;
res += (LL)v[idx] * l * r;
}
stk.push(i);
}
while (stk.size()) {
int idx = stk.top(); stk.pop();
int l = idx - (stk.size() ? stk.top() : -1), r = v.size() - idx;
res += (LL)v[idx] * l * r;
}
return res;
}
};
时空复杂度 O ( n ) O(n) O(n)。