说明:假设给定 [4, 2, 7, 12, 6, 4, 9, 8, 6, 10, 7, 4],为了直观的理解,给出了下图
从上图我们可以得出索引4和10的元素围成的最大面积为:10*6 = 60
在这里我们使用双指针法计算,直接上代码。
nums = [4, 2, 7, 12, 6, 4, 9, 8, 6, 10, 7, 4]
right = len(nums)-1 # 初始化右指针
left = 0 # 初始化做指针
S = 0 # 初始化面积
# 右指针不断向左移动,左指针不断向右移动,相遇时中断
while right - left > 0:
# 说明:
# 设S[i, j]为索引 i 和 j 之间的围成得到面积,假设 nums[i] < nums[j],现在左指针增大
# 只需要比较 S[i, j] 和 S[i+1, j],记录最大那个就行。
# 左指针向右移动,因为 S[i, j] = S[i+1, j] 并 (S[i, j-1], ..., S[i, i+1])
# 但是S[i, j-1], ..., S[i, i+1]中的任意一个都 <= S[i, j]
# 所以移动较小数字的那个指针并不会丢失 大面积 ,故可以放心的比较 S[i, j] 和 S[i+1, j]
if nums[left] < nums[right]:
S = max(nums[left] * (right - left), S)
left += 1
else:
S = max(nums[right] * (right - left), S)
right -= 1
print(S)