python的双指针法计算列表中两元素围成的最大面积

说明:假设给定 [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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值