此题其实和leetcode 84题解法是相同的。找到最小值,中心扩散求最大边界,取最大值。单调栈可以很方便的找到他的边界。此题的一点变化是我们需要构建一个前缀和数组。
N = int(input())
nums = [0] + list(map(int, input().split(' '))) + [0]
pre = [0 for _ in nums]
# 构建前缀和数组
sum0 = 0
for i, num in enumerate(nums):
sum0 += num
pre[i] = sum0
ret = 0
stack = []
for i, num in enumerate(nums):
while stack and num < nums[stack[-1]]:
val = nums[stack[-1]]*(pre[i-1]-pre[stack[-2]])
if val > ret: ret = val
stack.pop()
stack.append(i)
print(ret)