每天一道leetecode:11、乘最多水的容器

10題hard略過,哈哈哈哈

11題這道題,看起來很難得樣子,但是通過雙指針法還是很簡單的。

思路:設置兩個指針,一個在最前面,一個在最後面,然後不斷比較現在的面積和之前面積誰大,然後我們不斷將指針向裏面移動,移動規則是判斷指針對應的長度,誰更小誰向裏面移動。

矩陣的面積與兩個因素有關:

矩陣的長度:兩條垂直線的距離
矩陣的寬度:兩條垂直線其中較短一條的長度
因此,要矩陣面積最大化,兩條垂直線的距離越遠越好,兩條垂直線的最短長度也要越長越好。

def maxArea(height):
    left = 0
    right = len(height) - 1
    area = 0
    while left < right:
        cur = min(height[left], height[right]) * (right - left)
        area = max(area, cur)
        if height[left] < height[right]:
            left += 1
        else:
            right -= 1
    return area

h = list()
h.append(1)
h.append(8)
h.append(6)
h.append(2)
h.append(5)
h.append(4)
h.append(8)
h.append(3)
h.append(7)
print(maxArea(h))
p = list()
p.append(1)
p.append(2)
p.append(1)
print(maxArea(p))

像這種思路我是不敢寫的,因爲總感覺會漏掉一些特殊情況,leetecode給出了這道題的證明,大家有興趣的可以去看一下。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章