一、题设
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
二、基本思路
1.双层循环暴力解,直接无脑,但很容易超出限制,归根结底还是给的用例太多了,我看了一个案例有密密麻麻整两屏幕,服了。。。不过蓝桥杯上暴力解应该问题不大,leetcode有时间限制。
2.折半逼近,确实好用,有点类似折半查找。其实就是利用折半找到最大两个数的下标就完事了。
三、代码实现
1.暴力解
class Solution(object):
def maxArea(self, height):
select1 = 0 #选择第一根柱子下标
select2 = 0 #选择第二根柱子下标
sum_water = 0 #最大水量是多少
stage_sign = 0 #记录最高水位
for i in range(len(height)):#遍历第一根可能的柱子
for j in range(i,len(height)):#遍历的第二根可能的柱子
select1 = i #第一根柱子下标
select2 = j #第二根柱子
current_water = 0
max_stage = min(height[select1],height[select2]) #最大水位
current_water = max_stage * (select2 - select1) #盛水量计算
if current_water > sum_water:#比较记录
sum_water = current_water
return sum_water
2.折半逼近
class Solution(object):
def maxArea(self, height):
select1 = 0 #选择第一根柱子下标
select2 = len(height)-1 #选择第二根柱子下标
sum_water = 0 #最大水量是多少
while select1<select2:
current_water = min(height[select1] , height[select2]) * (select2 - select1)
if current_water > sum_water:
sum_water = current_water
if height[select1] > height[select2]:
select2 -= 1
else:
select1 += 1
return sum_water
四、效率总结
效率?法一没有效率可言,但是确实是一般人想到的最直接的方法,如果测试用例通过,那这题无疑是简单题,这题的关键就在于一下子看出不能用暴力,而又是在一堆数据中挑出两个数据,稍微熟练一些的开发者就会想到两边逼近,折半。关于题目呢,我真的不理解为什么图要画成那个样子,我第一个反应竟然是往不同高度的管子里灌水,蓝色部分是一个水缸,题目看成了求解中间水管能装多少水了哈哈哈,然后我又抽风了,我以为左管子只能取到[0,(len-1)/2)的范围,右管子取到[len-1)/2,len),对自己真的很无语。浅浅给大家看一下我之前看错题目敲得代码。这几天在忙着修改几篇论文,漏了三天的题目没做了,今天尽量多补几道,那么待会见哈哈哈~
class Solution(object):
def maxArea(self, height):
select1 = 0 #选择第一根柱子下标
select2 = 0 #选择第二根柱子下标
sum_water = 0 #最大水量是多少
left_sign = 0 #记录最大水量的左标
right_sign = len(height) #记录最大水量的右标
stage_sign = 0 #记录最高水位
#return len(height)
#return len(height)/2
for i in range(len(height)/2):#遍历第一根可能的柱子
for j in range(len(height)/2 , len(height)):#遍历的第二根可能的柱子
select1 = i #第一根柱子下标
select2 = j #第二根柱子
current_water = 0
max_stage = min(height[select1],height[select2]) #最大水位
for k in range(select1+1,select2):
if height[k] > max_stage:
current_water += max_stage
else:
current_water += height[k]
if current_water > sum_water:
sum_water = current_water
left_sign = i
right_sign = j
stage_sign = max_stage
return i,j,stage_sign,sum_water