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

给定 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

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

时间: 2024-10-08 16:03:24

leetcode(7)-盛最多水的容器的相关文章

[leetcode] 11.盛最多水的容器

盛最多水的容器 题意好绕,看半天都没懂要干什么. 我直接上个图可能就能一眼看明白了: 总之,当明白题意后,直接就能想到暴力法枚举所有可能性,不过如果再画一下图基本就能发现:两线段之间形成的区域总是会受到其中较短那条长度的限制. 我举个例子,对于所有以(1,a1)为左边构成的矩阵,最大的一个肯定在右边(n,an)开始数,第一个大于等于ai的边,我们记成aj.即以a1为左边的最大矩阵肯定是 以right边从(j,aj)~(n,an)构成矩阵中的其中一个.实际上,对于(1,a1)~(j,aj)的边,我

LeetCode 11 - 盛最多水的容器 - [双指针暴力]

题目链接:https://leetcode-cn.com/problems/container-with-most-water/description/ 给定 n 个非负整数 $a_1,a_2,\cdots,a_{n-1},a_n$,每个数代表坐标中的一个点 $(i, a_i)$.在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 $(i, ai_)$ 和 $(i, 0)$. 找出其中的两条线,使得它们与 $x$ 轴共同构成的容器可以容纳最多的水. 说明:你不能倾斜容器,且 $n$ 的值至少

Python版[leetcode]11. 盛最多水的容器(难度中等)

给定 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]输出: 4

leetcode——11.盛最多水的容器

双指针法: class Solution: def maxArea(self, height) -> int: if len(height)<=1: return 0 #双指针法 i,j,S=0,len(height)-1,0 while i<j: if height[i]<height[j]: S=max(S,height[i]*(j-i)) i+=1 else: S=max(S,height[j]*(j-i)) j-=1 return S 执行用时 :148 ms, 在所有 P

11. 盛最多水的容器

11. 盛最多水的容器 方法一 class Solution(object): def maxArea(self, height): """ :type height: List[int] :rtype: int """ h_len = len(height) i = 0 k = -1 s = [] while h_len + k - i >= 1: s.append(min(height[i], height[k]) * (h_len +

Leetcode_11【盛最多水的容器】

文章目录: 题目 脚本一及注释 脚本一逻辑 脚本二及注释 脚本二逻辑 题目: 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水. 说明:你不能倾斜容器,且 n 的值至少为 2. 图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7].在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 4

Leetcode(11)-盛最多水的容器

给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .画 n 条垂直线,使得垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水. 注意:你不能倾斜容器,n 至少是2. 思路:一开始我以为要用动态规划做,比如建立一个辅助数组dp[i][j],表示从i到j的最大容器.这样最后我直接查看dp[0][n]的值就可以.并且dp[i][i]=0,但是我并不知道动态转化方程是什么.比如dp[i

[LeetCode]11. Container With Most Water 盛最多水的容器

Given n non-negative integers a1, a2, ..., an , where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a contain

PHP算法之盛最多水的容器

给定 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 来源