码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode(7)-盛最多水的容器

时间:2020-01-01 21:05:55      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:循环   ble   端点   ref   tps   max   应该   code   自己   

给定 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(7)-盛最多水的容器

标签:循环   ble   端点   ref   tps   max   应该   code   自己   

原文地址:https://www.cnblogs.com/Lzqayx/p/12129585.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!