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]
输出: 49



脚本一及注释:【超时,但脚本是可实现此需求的】

#coding:gbk
list1 = [2,3,4,5,18,17,6]          #定义一个列表
max1 = 0                     #定义一个数值为零的变量      
n1 = 1                      #定义n1用于分片
long1 = len(list1)               #获取列表的元素个数
for i in range(long1):             #对列表元素个数组成的数列进行循环
    list2 = list1[n1:]             #取列表的分片,n1会随for循环自增
    n2 = 1                     #定义n2变量,用于获取遍历列表元素之间的长度,会随着for循环自增
    for j in list2:               #对分片后的列表进行遍历
        if list1[i] >= j:            #判断原列表遍历元素与分片后遍历元素的最小值
            curl = j * n2            #使用最小值乘以两元素长度
        else:                    
            curl = list1[i] * n2        #同上
        if max1 < curl:              #判断乘积是否大于记录最大值的变量
            max1 = curl              #若大于,则将乘积赋予最大值变量
        n2 += 1
    n1 += 1
print(max1)


脚本一逻辑:

  • 成最多水的容器必定为列表中两元素
  • 变量列表中的两两组合元素,求它们能装的水量,再与最大值进行对比,即可达到目标值


脚本二及注释:【用时140ms】

class Solution:
    def maxArea(self, height: List[int]) -> int:          #题目给定的输入及输出形式
        i,j,max1,long1 = 0,len(height) - 1,0,len(height) - 1   #分别给变量赋值
        while i < j:                           #当条件满足进入循环
            if height[i] <= height[j]:                 #判断列表中两元素的值大小
                curl = height[i] * long1                #取小值并乘以两元素之间的宽度
                i += 1                           #若小值为左边的,i加1
            else:
                curl = height[j] * long1                #若小值为列表右边的元素,求乘积
                j -= 1                           #j减去1
            if curl > max1:                        #与最大值进行比较判断
                max1 = curl
            long1 -= 1                            #长度减去一
        return(max1)                            #循环结束,返回记录最大值的变量


脚本二逻辑:

  • 此脚本最重要的逻辑是在什么情况下可以把列表中元素给剔除掉【最小值乘以其能连接的最大长度后,最小值元素可以剔除】
  • 同步比较列表两端的元素值大小,使用其中的小值乘以长度,并把乘积与记录最大值的变量进行比较,若大于最大值则替换
  • 每次比较完成后,长度都会减去1
  • 每次比较完成后,比较元素中都会有一个变化,或是左端向右移动一位;或是右端向左端移动一位,直到循环结束,此时已遍历了所有元素

原文地址:https://www.cnblogs.com/mailong/p/12008176.html

时间: 2024-11-03 16:21:00

Leetcode_11【盛最多水的容器】的相关文章

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

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

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. 思路:一开始我以为要用动态规划做,比如建立一个辅助数组dp[i][j],表示从i到j的最大容器.这样最后我直接查看dp[0][n]的值就可以.并且dp[i][i]=0,但是我并不知道动态转化方程是什么.比如dp[i

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$ 的值至少

盛最多水的容器

给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水. 说明:你不能倾斜容器,且 n 的值至少为 2. 1. 题目需要理解的一点,垂直线的宽度忽略不计,也就是说width = n -1 2. 一开始并没有什么好的方法,后来才意识到其实这题的关键在于隐藏信息 class Solution(object):

LeetCode11.盛最多水的容器 JavaScript

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

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

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大的,求面积 剪枝 外

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