LeetCode刷题——最大盛水量

最大盛水量题目的思路探讨与源码
最大盛水量的题目如下图,核心是在一个无序列表中寻找相距最远的,并且相对最大的两个数字,以此来形成一个最大的“盛水器”,即Container With Most Water。
在这里插入图片描述在这里插入图片描述
本人在看到该题目后,认为寻找最大盛水量其实是寻找最大的长方形面积,长方形的长是数字下标的间距,长方形的宽是两个数字的较小的那个数值。在上面那个例子,面积49是由长=7和宽=7得出,其中长度是下标=8-1=7,宽度是数值8和数值7之间的较小值,即宽度为7,最终得到最大面积为49。
从另一个角度来看,我们只需要从列表的两端出发,进行一次遍历即可。遍历的时候进行面积的计算和比较,保留更大的面积。该算法的时间复杂度应该是O(n),类似于双指针在列表上移动,一次移动一个指针的步骤。

#喷火龙与水箭龟
height=[1,8,6,2,5,4,8,3,7]
finalRes=0
ik=0
jk=len(height)-1
while(ik<jk):
	if(height[ik]<height[jk]):
		if(finalRes<=height[ik]*(jk-ik)):
			finalRes=height[ik]*(jk-ik)
		ik=ik+1
	else:
		if(finalRes<=height[jk]*(jk-ik)):
			finalRes=height[jk]*(jk-ik)
		jk=jk-1
		
print(finalRes)

在上述代码中,ik和jk是两个移动的下标,ik从列表的前端开始,jk从列表的后端开始,当ik超过jk时停止移动,搜索结束。在循环的内部来看,如果列表的前端的当前值比后端的当前值要大的时候,将此时的面积与最终的面积值进行比较,并且保留面积更大的值。如果列表的前端的当前值比后端的当前值要小,操作类似,最后将ik或jk的其中一个移动1位。最终输入是 [1,8,6,2,5,4,8,3,7] ,得到结果49是正确的。需要注意的是,本代码是作者的测试代码,如需放到LeetCode上运行,需要进行函数缩进和结果返回的修改才可以run。
最终结果如下:
在这里插入图片描述
非常奇怪的是,第一次提交该代码时,花的时间是184ms,第二次一模一样代码提交的时候时间是116ms,不知道是不是网络原因哈哈哈哈。
在这里插入图片描述
从理论上来说,本人的思路应该还不是最优的,希望朋友们能够多多指教。

发布了24 篇原创文章 · 获赞 25 · 访问量 5290

猜你喜欢

转载自blog.csdn.net/qq_26727101/article/details/104084323
今日推荐