11. 盛最多水的容器 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/container-with-most-water/ 目标:输入隔板高度,输出最大水箱容量及选取的隔板坐标。
思路:让左右距离尽可能大、短板尽可能高。当某侧为短板时,向内寻找下一块隔板,此时左右距离一定会变小,但是短板高度可能会变高,因此有可能产生更优解。比较新水箱的容量和旧水箱的容量,保留最大值及所选的隔板,以此类推。
解法:采用双指针解题,i指向开始隔板位置,j指向结束隔板位置,i从左到右遍历,j从右到左遍历。
# 输入n个非负整数,每个整数代表一个点(i,a(i))
# 每个点到x轴的距离为隔板的高,两个隔板可以形成一个水箱
# 选出两个隔板,使形成的水箱容量最大
bad_input = False
while True:
try:
box_list = list(map(int,input('请输入至少2个非负整数:').split()))
if len(box_list) < 2:
print('输入数字小于2个,请重新输入!')
continue
for i in box_list:
if i < 0:
print('存在负数,请重新输入!')
bad_input = True
break
if bad_input:
continue
else:
break
except ValueError:
print('请重新输入符合标准的数字!')
print(box_list)
i,j,res = 0,len(box_list)-1,[0,0,0]
while i < j :
if box_list[i] < box_list[j]:
if res[0] < box_list[i]*(j-i):
res = [box_list[i] * (j - i),i,j]
i += 1
else:
if res[0] < box_list[j] * (j - i):
res= [box_list[j] * (j - i),i,j]
j -= 1
print('水箱最大容量为{},选取的隔板坐标为{}和{}'.format(res[0],res[1],res[2]))



