【20190706】【每天一道算法题】盛最多水的容器(双指针)

问题

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

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

【20190706】【每天一道算法题】盛最多水的容器(双指针)_第1张图片

示例:

输入: [1,8,6,2,5,4,8,3,7]

输出: 49


思路及解答

1. Python实现 

# 方法一:暴力法(两次循环)
# 结果正确,但超出时间限制
# 时间复杂度:O(n^2)
class Solution:
    def maxArea(self, height: List[int]) -> int:
        l = len(height)
        result = 0
        for i in range(l):
            for j in range(i+1, l):
                tmp = min(height[j], height[i]) * (j - i)
                if tmp > result: result = tmp  
                else: result = result
        return result
		
		
# 方法二:双指针
# 定义两个指针分别指向首和尾,计算此时的面积。然后将高度较短的那个指针移动到下一个待判断的位置(如果是头指针那么向后移动,如果是尾指针那么向前移动),并计算每次的面积与前面的面积相比较,最终得出最大面积。
# 时间复杂度:O(n)(一次扫描)
class Solution:
    def maxArea(self, height: List[int]) -> int:
        l = len(height)
        i, j, result = 0, l-1, 0
        while i < j:
            tmp = min(height[i], height[j]) * (j - i)
            if tmp > result: 
                result = tmp 
            if height[i] < height[j]:
                i = i + 1 
            else:
                j = j - 1
        return result

 

你可能感兴趣的:(每天一道算法题)