classSolution:defmaximumSumOfHeights(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 为峰顶,右侧高度和最大值defcal(f): st = []for i inrange(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 =0for i inrange(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。