轻松一刻,算法求最大蓄水面积

Posted 柳清风09

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了轻松一刻,算法求最大蓄水面积相关的知识,希望对你有一定的参考价值。

一个有意思的题目,求最大蓄水面积
简单介绍一下,找到两个柱子,使其“蓄水”面积最大譬如

Input: [1,8,6,2,5,4,8,3,7]
Output: 49


如果是直接暴力破解当然可以,两层for循环,组合所有可能,搞定
当然这肯定不是最好的方式,我们仔细思考一下,就会发现这个面积取决两个因素:长 * 宽
这不是废话吗!当这个“水池”的左右两个边分别是开始和结束的柱子,那么它的长最大了,水池的长度最大应该是这个数组的长度。我们设想两个指针,分别指向开始和结束这两个柱子,求得第一个面积,但这个面积可能不是最大的,因为宽度可能不够高,于是我们缩小长度(减一),寻找更高的宽度从而弥补长度带来的损失
关键是该如何寻找呢,回到例子,第一个柱子高度是1,最后一个柱子高度是7,整个面积的宽度受限于最小的高度(木桶效应),那么还有必要计算第一个柱子和其他的柱子之间的面积了吗?没有必要,因为第一个柱子无论和后面2-8个柱子里面哪一个柱子组合都不可能会超过这个面积了。所以,受限于最短柱子,后面无需再运算了。
所以如果想找到更高的,就右移动左边的指针,开始计算第二个柱子和最后一个柱子,然后继续抛弃其中较小的柱子,直达这两个指针相遇。
下面是我用go的简单实现,仅供参考

func maxArea(height []int) int 
	var result int
	for i,j := 0,len(height)-1; i < j;
		result = maxInt(result, (j -i ) * minInt(height[i], height[j]))
		if height[i] < height[j]
			i ++
		else
			j --
		
	
	return result


func maxInt(x, y int) int 
	if x >y 
		return x
	
	return y


func minInt(x, y int) int 
	if x >y 
		return y
	
	return x

以上是关于轻松一刻,算法求最大蓄水面积的主要内容,如果未能解决你的问题,请参考以下文章

蓄水池算法

MySTL:蓄水池抽样算法

蓄水池算法在抽奖中的应用

Reservoir Sampling - 蓄水池抽样算法

蓄水池抽样算法

蓄水池抽样算法