LC 2866. 美丽塔 II
https://leetcode.cn/problems/beautiful-towers-ii/
这题前面一题是相同的题目,但是是更小的数据量,思路就是枚举每个点为最高点。这题数据量在10^5级别,所以没有办法使用枚举了。
大致思路也好办,就是尽可能使用之前的结果:
- 如果hs[i] >= hs[i-1] 的话,那么就是 st[i-1] + hs[i]
- 如果hs[i] < hs[i-1] 的话,那么就需要找到最近的一个点
- 这个点 hs[x] <= hs[i].
- 那么就是 st[x + hs[i] * (i - x) (这段使用hs[i]削平)
所以问题就怎么寻找这个点。这个点没有办法同时二叉树来维护,因为二叉树的关系只能选择一个进行保持:要么是value, 要么是position. 没有办法同时维持两个。所以下次遇到这类问题的话,二叉树还是早点放弃比较好。
最终解决办法还是需要维持一个堆栈,这个堆栈是递增的,value和position都是递增的。
class Solution:
def maximumSumOfHeights(self, maxHeights: List[int]) -> int:
def compute(hs):
left = [0] * len(hs)
st = []
for i in range(len(hs)):
while st and hs[i] < hs[st[-1]]:
st.pop()
if not st:
left[i] = hs[i] * (i + 1)
else:
j = st[-1]
left[i] = left[j] + hs[i] * (i - j)
st.append(i)
return left
left = compute(maxHeights)
right = compute(maxHeights[::-1])
right = right[::-1]
DEBUG = False
if DEBUG:
print(maxHeights)
print(left)
print(right)
ans = 0
for i in range(len(maxHeights)):
c = left[i] + right[i] - maxHeights[i]
ans = max(ans, c)
return ans