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給出了這道題的證明,大家有興趣的可以去看一下。