遇到这种题目不要慌张,根据要求,一步步的来思考。
from typing import List
def max_area(height: List[int]) -> int:
"""
暴力遍历,时间复杂度是O(n^2),本质上也是双指针,two pointers
:param height:
:return:
"""
max_a = 0
for i in range(len(height)):
for j in range(i + 1, len(height)):
if height[i] > height[j]:
a = (j - i) * height[j]
else:
a = (j - i) * height[i]
if a > max_a:
max_a = a
return max_a
def max_area2(height: List[int]) -> int:
"""
这里有个技巧,首是间距最大个两个bar,肯定有一个大的或一个小的,如果相等的话移动哪个都一样了。
最长间距的两个bar围成的面积是受最短的bar所限制,area = distance * min_bar
下面要移动左边或右边的bar,假如移动较大的,则下一个的面积最大是 (distance -1)* min_bar,与上面
的面积比较肯定是减小了。所以要移动较小的值的bar的index。
这里用两个指针来记录围成矩形的两个边。
:param height:
:return:
"""
max_a = 0
idx_l = 0
idx_r = len(height) - 1
for _ in range(len(height)):
height_l, height_r = height[idx_l], height[idx_r]
if height_r > height_l:
area = (idx_r - idx_l) * height_l
idx_l += 1
else:
area = (idx_r - idx_l) * height_r
idx_r -= 1
if area > max_a:
max_a = area
return max_a
if __name__ == '__main__':
hs = [1, 8, 6, 2, 5, 4, 8, 3, 7]
print(max_area2(hs))