LeetCode 盛最多水的容器

盛最多水的容器


題目來源:https://leetcode-cn.com/problems/container-with-most-water/python

題目


給定 n 個非負整數 a1,a2,...,an,每一個數表明座標中的一個點 (i, ai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別爲 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器能夠容納最多的水。segmentfault

說明:你不能傾斜容器,且 n 的值至少爲 2。數組

圖片來源於 LeetCode

圖中垂直線表明輸入數組 [1,8,6,2,5,4,8,3,7]。在此狀況下,容器可以容納水(表示爲藍色部分)的最大值爲 49。bash

示例:微信

輸入: [1,8,6,2,5,4,8,3,7]
輸出: 49

解題思路


  1. 採用雙指針的方法;
  2. 定義最大值 max_area 用以比較肯定最終最大值。定義雙指針,一個指向開始,一個指向末尾;
  3. 雙指針向兩邊靠攏,靠攏的準則:指針指向的線較短部分往較長的線那邊移動。具體的緣由是:距離肯定,最終盛放的容量大小由較短的線決定,若往較長線移動,移動後指針指向的線若變長,雖然距離變短,當仍有可能與距離乘積比前面定義的 max_area 的值大(也就是盛放的容量變大);
  4. 兩個指針重合退出循環,返回最終肯定的最大值 max_area

下圖是對指針靠攏以及容器容量變化的圖解(第一次製做,有點糙 Orz)spa

動圖圖解

代碼實現


class Solution:
    def maxArea(self, height: List[int]) -> int:
        # 定義最大值,用之後續比較
        # 定義雙指針,一個指向開始,一個指向末尾
        max_area, l, r = 0, 0, len(height) - 1
        # 雙指針向中間靠攏
        while l < r:
            # 以較短的線爲準,與兩線之間的距離之積就是可盛放水量的值
            # 與定義的最大值 max_area 比較,取大值從新賦值給 max_area
            max_area = max(max_area, min(height[l], height[r]) * (r - l))
            # 每次移動的準則:較短的線往較長線的靠攏
            # 具體緣由:往較長線移動,移動後的線若變長,雖然距離變短,當仍有可能與距離乘積變大(也就是盛放的容量變大)
            if height[l] < height[r]:
                l += 1
            else:
                r -= 1
        return max_area

實現結果


Container_with_most_water_submissions


以上就是本篇的主要內容

歡迎關注微信公衆號《書所集錄》
相關文章
相關標籤/搜索