1. 程式人生 > >裝最多水的容器

裝最多水的容器

題目描述:給定 n 個非負整數 a1, a2, ..., an, 每個數代表了座標中的一個點 (i, ai)。畫 n 條垂直線,使得 i 垂直線的兩個端點分別為(i, ai)和(i, 0)。找到兩條線,使得其與 x 軸共同構成一個容器,以容納最多水。

樣例:給出[1,3,2], 最大的儲水面積是2.

根據題意,儲水面積是由兩個高度的最小值 * 兩個高度間的水平距離構成的。描述成程式碼的語言,就是:

min(heights[left], heights[right]) * (right - left)     (1)

其中,heights表示給出的高度值的陣列,left和right分別是我們選擇的兩個高度。

那麼,這道題可以這樣設計:兩個指標分別從陣列兩端開始向中間遍歷,每次按照上面的公式(1)計算面積,這個面積和之前的最大面積比較,儲存下較大的那個作為新的最大面積。同時將較低的那個高度,向他的方向移動一位。,再對上面的過程迭代,直到遍歷完整個陣列,返回此時的最大面積即可。

程式碼如下:

class Solution:
    # @param heights: a list of integers
    # @return: an integer
    def maxArea(self, heights):
        if len(heights) == 0:
            return 0
        left, right = 0, len(heights) - 1
        max_value = min(heights[left], heights[right]) * (right - left)
        while left < right:
            if heights[left] <= heights[right]:
                left += 1
                max_value = max(max_value, min(heights[left], heights[right]) * (right - left))
            else:
                right -= 1
                max_value = max(max_value, min(heights[left], heights[right]) * (right - left))
        return max_value
        # write your code here