Leetcode_11盛最多水的容器
Posted 弈神
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
- 每次比较完成后,比较元素中都会有一个变化,或是左端向右移动一位;或是右端向左端移动一位,直到循环结束,此时已遍历了所有元素
以上是关于Leetcode_11盛最多水的容器的主要内容,如果未能解决你的问题,请参考以下文章