- 盛最多水的容器
给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例:
输入: [1,8,6,2,5,4,8,3,7]
输出: 49
1
我的思路:
感觉暴力法肯定通不过,所以想这样,有一根线从底部,一格一格向上走,每向上走一格,就获取最大容量,直到走到最上端。
代码如下:
def maxArea(height):
max = 0
for i in sorted(set(height)):
left = 0
right = 0
FOUND1 = False
FOUND2 = False
print('*' * 40)
print('Current i: %s' % i)
for j in range(len(height) - 1):
if height[j] >= i:
left = j
FOUND1 = True
break
for j in range(-1, -len(height), -1):
if height[j] >= i:
right = len(height) + j
FOUND2 = True
break
print(left, right)
if right > left and FOUND1 and FOUND2:
temp = (right - left) * i
max = temp if temp > max else max
return max
提交后,“ 超出时间限制”
2
参照官方思路:
class Solution:
def maxArea(self, height: List[int]) -> int:
max = 0
i = 0
j = len(height) - 1
while i != j:
if height[i] <= height[j]:
temp = height[i] * (j - i)
max = temp if temp > max else max
i += 1
else:
temp = height[j] * (j - i)
max = temp if temp > max else max
j -= 1
return max
问题在于,看到了人家的思路,感觉真厉害,可自己就是想不出。
不知道做得多了,会不会自己也变得厉害些。