LC 2866. 美丽塔 II

https://leetcode.cn/problems/beautiful-towers-ii/

这题前面一题是相同的题目,但是是更小的数据量,思路就是枚举每个点为最高点。这题数据量在10^5级别,所以没有办法使用枚举了。

大致思路也好办,就是尽可能使用之前的结果:

所以问题就怎么寻找这个点。这个点没有办法同时二叉树来维护,因为二叉树的关系只能选择一个进行保持:要么是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