给定
n
n
n个非负整数
[
a
1
,
a
2
,
.
.
.
,
a
n
]
[a_1,a_2,...,a_n]
[a1,a2,...,an],每个整数代表坐标中的一个点
(
i
,
a
i
)
(i,a_i)
(i,ai)。在坐标系内画
n
n
n条垂线,点
(
i
,
a
i
)
(i,a_i)
(i,ai)与点
(
i
,
0
)
(i,0)
(i,0)分别代表垂直线
i
i
i的两个端点。找出两条线使它们与x轴共同构成的容器可以容纳最多的水。
当索引的差值相同时,容器的容积取决于较短的线段。因此从两端往中间搜索时,索引差值减小,因此只有从较短线段侧改变索引才有可能取得较大容积。
def get_max_volumn(nums):
left_index, right_index = 0, len(nums) - 1
max_volumn = 0
while left_index < right_index:
max_volumn = max(max_volumn, min(nums[left_index], nums[right_index]) * (right_index - left_index))
if nums[left_index] < nums[right_index]:
left_index += 1
else:
right_index -= 1
return max_volumn
双指针法时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1)。若采用暴力算法则时间复杂度为 O ( n 2 ) O(n^2) O(n2)。