盛水最多的容器:双指针法

  给定 n n n个非负整数 [ a 1 , a 2 , . . . , a n ] [a_1,a_2,...,a_n] [a1,a2,...,an],每个整数代表坐标中的一个点 ( i , a i ) (i,a_i) (i,ai)。在坐标系内画 n n n条垂线,点 ( i , a i ) (i,a_i) (i,ai)与点 ( i , 0 ) (i,0) (i,0)分别代表垂直线 i i i的两个端点。找出两条线使它们与x轴共同构成的容器可以容纳最多的水。
  当索引的差值相同时,容器的容积取决于较短的线段。因此从两端往中间搜索时,索引差值减小,因此只有从较短线段侧改变索引才有可能取得较大容积。

def get_max_volumn(nums):
    left_index, right_index = 0, len(nums) - 1
    max_volumn = 0
    while left_index < right_index:
        max_volumn = max(max_volumn, min(nums[left_index], nums[right_index]) * (right_index - left_index))
        if nums[left_index] < nums[right_index]:
            left_index += 1
        else:
            right_index -= 1
    return max_volumn

  双指针法时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1)。若采用暴力算法则时间复杂度为 O ( n 2 ) O(n^2) O(n2)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值