Container with most water(盛水最多的容器)

Container with most water(盛水最多的容器) 简单的证明

如图
Container with most water(盛水最多的容器)_第1张图片

题目: 给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

解答思路: 题目大致意思从中选出两个坐标,使其和x轴组成的容器的容量最大。
1:暴力遍历:使用双循环遍历。这里不做介绍。
2: 双指针法:以上图为例,一指针left位于首位,另一right在末尾。如果left(对应的值) 简单的解释(证明):现在只要证明最大值在此循环当中,就说明此方法正确。
设在一次循环中:容积=left*(right-left),如果left的对应值小于right对应的值,那么,容易知道left与left和right之间任何一个数组成的容积都小于left*(right-left),并且right右边的数与left组成的容器的值也一定小于某个值,所以left没有再和其他木板组成容器的必要,所以i++;相当于舍弃了left与其他所有木板(除了right)的计算。但是我们可以知道舍弃的计算和我们循环不会遗漏任何情况,并且舍弃的值都是较小的值,所以这种循环一定会找到最大值。

java代码实现:

class Solution {
public int maxArea(int[] height) {
int max=0;
int i=0;
int j=height.length-1;
while(i int k=Math.min(height[i],height[j])*(j-i);
if (k>max)
max=k;
if (height[i]>height[j])
j–;
else i++;
}
return max;
}
}

你可能感兴趣的:(Container with most water(盛水最多的容器))