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
  • 每次比较完成后,比较元素中都会有一个变化,或是左端向右移动一位;或是右端向左端移动一位,直到循环结束,此时已遍历了所有元素

猜你喜欢

转载自www.cnblogs.com/mailong/p/12008176.html