裝最多水的容器
阿新 • • 發佈:2019-02-16
題目描述:給定 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