LeetCode.11 Container With Most Water

题目简介:

这里对题目作进一步形式化定义,给定一组非负整型数a_{1},a_{2},\cdots,a_{n},题目希望找到两个数字a_{i},a_{j} \ i<j,使得目标函数(j-i)\times{min(a_i,a_j)}最小。

举例说明:输入一组非负整型数 [1,8,6,2,5,4,8,3,7]

由上图可知,每个数字表示柱子的高度,题目希望找到两个柱子可以装下尽可能多的水。

解法一:

按照惯例,解法一般是暴力解法,可惜python的循环效率实在是低了点,整型数一多,两重循环就直接超时了。但思路还是可以了解一下,遍历所有的a_{i},a_{j} \ i<j整型数对,总共需要遍历作\binom{n}{2}次。

解法二:两指针法

在采用解法二之前,小天尝试过很多方法将复杂度降至O(n),但大多是不可行的。其实,这道题虽然可以被形式是一道最优化题,但实际上还是一道搜索题。解法二中初始化两个指针分别指向数组的两端,然后判断两指针多所指向的整型数,舍弃较小数,将其指针往里移动。因为每次只移动一个指针,故而时间复杂度降低至O(n)

官网给出非常详细的解释,因为初始化条件下,所占长度是最长的。左右两边无论哪一边向内移动,占用长度上都是相同的,那只需要决策出那种移动更有利即可。另一方面,可容纳的水量受到较短高度的限制,每次舍去较短长度可以增加限制。

class Solution:
    def maxArea(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        n, m = 0, len(height) - 1
        max_area = 0
        while n < m:
            max_area = max(max_area, min(height[n], height[m]) * (m - n))
            if height[n] > height[m]: m -= 1
            else: n += 1
        return max_area 

总结:

LeetCode上的题目大多从真实的项目中抽象出来,非常适合练手。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值