盛最多水的容器
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。画 n 条垂直线,使得垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
注意:你不能倾斜容器,n 至少是2。
首先需要指出的是该问题描述不清晰,两条线与x轴如何能构成一个容器,以x轴为直径的圆为底,两条线较短者为高构成一个容器?
看了下LeetCode上的解答,都是计算两条线与x轴构成最大的面积。如下内容也是按照计算最大面积求解。
对于(i, ai) 、 (j, aj)与x轴构成的面积area=(j-i) * min(ai, aj)
数组height存储了每个点,height[i]代表(i, ai)
求解放法:
可以选择两个指针p,q分别指向height的前后两个节点 maxArea=(q-p) * Math.min(height[p], height[q])
若height[p]>height[q] 就移动q使q减1, 这是由于若移动p(p++),则新得到的area一定小于上步,(q-p)减小了1,min(height[p],height[q])也小于等于上步。
反之p++
代码如下:
public static int maxArea(int[] height) { int p = 0; int q = height.length - 1; int maxArea = 0; int temp; while (p<q) { temp = (q-p)*Math.min(height[p], height[q]); maxArea = maxArea>temp?maxArea:temp; if (height[p]<height[q]) p++; else q--; } return maxArea; }
备注:
最大面积并不一定是最大容量,如果按照最大容量计算,maxCapacity = pi*(q-p)/2*(q-p)/2 * min(height[p], height[q])
上述方法依然可行,只需将maxArea 改为 double型的maxCapacity
posted on 2018-04-23 20:52 Deltadeblog 阅读(1524) 评论(0) 编辑 收藏 举报