class Solution {
public:
long long maximumSumOfHeights(vector<int>& maxHeights) {
int n = maxHeights.size();
long long res = 0;
vector<long long> prefix(n), suffix(n);
stack<int> stack1, stack2;
for (int i = 0; i < n; i++) {
while (!stack1.empty() && maxHeights[i] < maxHeights[stack1.top()]) {
stack1.pop();
}
if (stack1.empty()) {
prefix[i] = (long long)(i + 1) * maxHeights[i];
} else {
prefix[i] = prefix[stack1.top()] + (long long)(i - stack1.top()) * maxHeights[i];
}
stack1.emplace(i);
}
for (int i = n - 1; i >= 0; i--) {
while (!stack2.empty() && maxHeights[i] < maxHeights[stack2.top()]) {
stack2.pop();
}
if (stack2.empty()) {
suffix[i] = (long long)(n - i) * maxHeights[i];
} else {
suffix[i] = suffix[stack2.top()] + (long long)(stack2.top() - i) * maxHeights[i];
}
stack2.emplace(i);
res = max(res, prefix[i] + suffix[i] - maxHeights[i]);
}
return res;
}
};
初始化变量:
int n = maxHeights.size();
:获取数组maxHeights
的长度。long long res = 0;
:初始化结果变量res
,用于存储最大的前缀和与后缀和的总和。vector<long long> prefix(n), suffix(n);
:初始化两个长度为n
的向量prefix
和suffix
,分别用于存储每个位置的前缀和与后缀和。stack<int> stack1, stack2;
:初始化两个栈stack1
和stack2
,用于辅助计算前缀和与后缀和。计算前缀和:
for (int i = 0; i < n; i++) { ... }
:遍历数组maxHeights
。
while (!stack1.empty() && maxHeights[i] < maxHeights[stack1.top()]) { stack1.pop(); }
:如果当前元素小于栈顶元素对应的高度,则弹出栈顶元素,直到栈为空或当前元素大于等于栈顶元素对应的高度。if (stack1.empty()) { prefix[i] = (long long)(i + 1) * maxHeights[i]; } else { prefix[i] = prefix[stack1.top()] + (long long)(i - stack1.top()) * maxHeights[i]; }
:如果栈为空,则当前的前缀和为(i + 1) * maxHeights[i]
;否则,当前的前缀和为栈顶元素的前缀和加上从栈顶元素到当前元素的距离与当前元素高度的乘积。stack1.emplace(i);
:将当前元素的索引压入栈中。计算后缀和:
for (int i = n - 1; i >= 0; i--) { ... }
:逆序遍历数组maxHeights
。
while (!stack2.empty() && maxHeights[i] < maxHeights[stack2.top()]) { stack2.pop(); }
:如果当前元素小于栈顶元素对应的高度,则弹出栈顶元素,直到栈为空或当前元素大于等于栈顶元素对应的高度。if (stack2.empty()) { suffix[i] = (long long)(n - i) * maxHeights[i]; } else { suffix[i] = suffix[stack2.top()] + (long long)(stack2.top() - i) * maxHeights[i]; }
:如果栈为空,则当前的后缀和为(n - i) * maxHeights[i]
;否则,当前的后缀和为栈顶元素的后缀和加上从当前元素到栈顶元素的距离与当前元素高度的乘积。stack2.emplace(i);
:将当前元素的索引压入栈中。res = max(res, prefix[i] + suffix[i] - maxHeights[i]);
:更新结果res
为当前的前缀和与后缀和的总和减去当前元素的高度与res
的较大值。返回结果:
return res;
:返回最大的前缀和与后缀和的总和。