(算法题)(python3)求盛水最多的容器大小

先上题干:

给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。

例图

图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

看到题目的第一眼,脑子里面浮现的是用暴力法:简单粗暴用两层循环来遍历每个元素,取高度相对较短一边的值为宽,乘以右侧元素下标减去左侧下标得到的长,最后将得到的面积依次比较,取其中最大的值即为结果。

方法在本地运行通过,于是放到leetcode上跑测试用例,但是在这里就出了问题,遇到样本比较大的测试数组,会因为运行时间比较长导致提交失败。。想想毕竟是中等算法题,如果还用简单粗暴效率低的老办法就没意思了,于是又有了下面的解法二。

解法二:

题目要求最大容器容量,容器的面积相当于是一个长方形的面积,即面积 = 长 * 宽,则基准条件是找出尽量大的长和宽。长对应的上图左右两根垂直线间距离,宽对应垂直线高度,这里要求两侧的柱子间距要尽量远,且两端高度要尽量高,代码如下:

def max_area(height):
    """
    :type height: List[int]
    :rtype: int
    """
    # 左右两侧下标
    left = 0
    right = len(height) - 1
    max = 0
    # 对比的数组元素至少有2个,则继续循环
    while right > left:
        l = right - left
        if height[left] < height[right]:
            h = height[left]
            sqr = h * l
            left = left + 1
        else:
            h = height[right]
            sqr = h * l
            right = right - 1
        if sqr > max:
            max = sqr
    return max

据官方的线索,这里的题解时间复杂度推荐是O(n),即最多只能有一个循环,这里方法二的解法通过一个while循环判断得到结果,循环次数大致为数组的长度。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,431评论 0 2
  • 题目介绍 题目:盛最多水的容器描述:给定 n 个非负整数 a1, a2, ..., an,每个数代表坐标中的一个点...
    大大纸飞机阅读 568评论 0 2
  • 题目 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n ...
    sxqiong阅读 316评论 2 0
  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 13,807评论 0 89
  • 放假的第一天,因为昨晚熬夜了,所以犯困了一天; 也无聊了一天,实在是不知道干嘛,技术不想看啊 记一段歌词,太好听了...
    MissSad阅读 197评论 0 0