[python 刷题] 11 Container With Most Water

[python 刷题] 11 Container With Most Water

题目:

You are given an integer array height of length n. There are n vertical lines drawn such that the two endpoints of the ith line are (i, 0) and (i, height[i]).

Find two lines that together with the x-axis form a container, such that the container contains the most water.

Return the maximum amount of water a container can store.

Notice that you may not slant the container.

这道题也是一个比较经典的双指针+贪心,求的事总面积,题目中已经提出容器无法被倾倒 ,在不考虑三角的情况下,面积的构成就是 长(x 轴) x 宽(y 轴) 的组合,

以案例 1 而言:[1,8,6,2,5,4,8,3,7],分析如下:

当左右指针指向最两边时,面积是这样的:

[python 刷题] 11 Container With Most Water_第1张图片

此时面积为 m i n ( 1 , 7 ) × 8 min(1, 7) \times 8 min(1,7)×8

可以看到,容器的面积是收到长和高的限制,而高的选取则为 m i n ( l e f t , r i g h t ) min(left, right) min(left,right),也就是说,高都不变,指针之间的距离越小,面积自然就越小。

这个情况下,最合理的做法就是移动较低一边的指针,这样长度虽然减少了,但是高度增加的话,面积还是有可能会增加:

[python 刷题] 11 Container With Most Water_第2张图片

此时的面积为 m i n ( 7 , 8 ) × 7 min(7, 8) \times 7 min(7,8)×7

接着重复这样的操作:

[python 刷题] 11 Container With Most Water_第3张图片

一直到完成遍历即可

代码如下:

class Solution:
    def maxArea(self, height: List[int]) -> int:
        res = 0
        l, r = 0, len(height) - 1

        while l < r:
            res = max(res, min(height[l], height[r]) * (r - l))
            if height[l] < height[r]:
                l += 1
            else:
                r -= 1

        return res

这道题的空间复杂度为 O ( 1 ) O(1) O(1),只需保留最终结果和 2 个指针,时间复杂度为 O ( n ) O(n) O(n)

多提一句,只是针对这道题,greedy 一定能够导出有最优解,所以没有必要使用 DP,DP 因为要寻找全局最优解,所以时间复杂度为 O ( n 2 ) O(n^2) O(n2)

你可能感兴趣的:(#,leetcode,python,开发语言)