leetcode-盛最多水的容器
Posted 李志琦的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode-盛最多水的容器相关的知识,希望对你有一定的参考价值。
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点?(i,?ai) 。在坐标内画 n 条垂直线,垂直线 i?的两个端点分别为?(i,?ai) 和 (i, 0)。找出其中的两条线,使得它们与?x?轴共同构成的容器可以容纳最多的水。
链接:https://leetcode-cn.com/problems/container-with-most-water
解题思路
从left 开始,从right找比h_l大的,求面积
从right开始,从left找比h_r大的,求面积
剪枝
- 外层循环找的高度需要越来越大,内层循环的起始点也越来越靠近另一边
- 用maxA做限制,在外层循环,内层循环都做剪枝
代码
class Solution:
def maxArea(self, height) -> int:
maxA = 0
maxl = 0
begin_r = len(height)-1
for i in range(len(height)):
h_l = height[i]
if h_l> maxl:
maxl = h_l
else:
continue
if h_l*(begin_r-i)<maxA:
#break
continue
for j in range(begin_r,i,-1):
if height[j]>=h_l:
begin_r = j
maxA = max(maxA,h_l*(j-i))
break
if h_l*(j-i)<=maxA:
break
maxr = 0
begin_l = 0
for i in range(len(height)-1,-1,-1):
h_r = height[i]
if h_r>maxr:
maxr = h_r
else:
continue
if h_r*(i-begin_l)<maxA:
#break
continue
for j in range(begin_l,i):
if height[j]>=h_r:
begin_l = j
maxA = max(maxA,h_r*(i-j))
break
if h_r*(i-j)<=maxA:
break
return maxA
#s = Solution()
#print(s.maxArea([5,2,12,1,5,3,4,11,9,4]))
自己写的应该算是介于暴力循环和双指针之间的算法了。
双指针的python 实现
class Solution:
def maxArea(self, height: List[int]) -> int:
# i为起始长度,j为最长长度,max_area为面积最大值
i, j, max_area = 0, len(height) - 1, 0
while i < j:
if height[i] < height[j]:
# 长方形的面积为长*较短高度
max_area = max(max_area, height[i] * (j - i))
# 长方形的高度向较高方向移动
i += 1
else:
# 长方形的面积为长*较短高度
max_area = max(max_area, height[j] * (j - i))
# 长方形的高度向较高方向移动
j -= 1
return max_area
以上是关于leetcode-盛最多水的容器的主要内容,如果未能解决你的问题,请参考以下文章
算法leetcode|11. 盛最多水的容器(rust重拳出击)