class Solution:
def maximumSumOfHeights(self, maxHeight: List[int]) -> int:
# 枚举 i 作为顶峰,其取值贪心的取 maxHeight[i]
# 其左侧第一个小于它的位置 l,[l + 1, i] 都可以且最多取到 maxHeight[i]
n = len(maxHeight)
f = [-1] * n # f[i] 表示 i 为峰顶,左侧高度和最大值
g = [-1] * n # g[i] 表示 i 为峰顶,右侧高度和最大值
def cal(f):
st = []
for i in range(len(maxHeight)):
while st and maxHeight[i] < maxHeight[st[-1]]:
st.pop()
# 其左侧第一个小于它的位置 l,[l + 1, i] 都可以且最多取到 maxHeight[i]
if st:
f[i] = (i - st[-1]) * maxHeight[i] + f[st[-1]]
else:
f[i] = maxHeight[i] * (i + 1)
st.append(i)
cal(f)
maxHeight = maxHeight[::-1]
cal(g)
maxHeight = maxHeight[::-1]
ans = 0
for i in range(len(maxHeight)):
ans = max(ans, f[i] + g[n - 1 - i] - maxHeight[i])
return ans
复杂度分析
令 n 为数组长度
时间复杂度:$O(n)$
空间复杂度:$O(n)$
f 和 g 以及 st 都使用 n 的空间。并且我们仅遍历了 maxHeights 数组三次,因此时间和空间复杂度都是 n。