题目描述
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。
题目解析
题目意思不难理解,最初的想法就是用暴力搜索,显然超时了,嘤。
max_area = 0
for i in range(len(height)):
for j in range(i+1,len(height)):
area = (j-i) * min(height[i],height[j])
if(area > max_area):
max_area = area
然后看了解析才知道,可以用双指针。一个指向数组第0个元素,一个指向数组最后一个元素(相当于容器的边界),然后移动这两个元素中较小的元素的指针,不停判断,直到左边的指针大于右边的指针。
left_index = 0
right_index = len(height)-1
max_area = 0
while(left_index < right_index):
area = (right_index - left_index) * min(height[right_index],height[left_index])
if(area > max_area):
max_area = area
if(height[right_index] < height[left_index]):
right_index = right_index - 1
else:
left_index = left_index + 1
Tips
- 关于双指针,在归并排序,二分查找中都有见过,但是应用于这一道题,是怎么都想不到的,所以还是要多积累。
- 目前开始刷数组的题目咯!