美文网首页
找两条竖线然后这两条线以及X轴构成的容器能容纳最多的水

找两条竖线然后这两条线以及X轴构成的容器能容纳最多的水

作者: 柳岸花开 | 来源:发表于2017-03-15 16:38 被阅读23次
解题思路:
* 使用贪心算法,
* 1.首先假设我们找到能取最大容积的纵线为 i, j (假定i<j),
* 那么得到的最大容积 C = min( ai , aj ) * ( j- i) ;
*
* 2.下面我们看这么一条性质:
* ①: 在 j 的右端没有一条线会比它高!假设存在 k |( j<k && ak > aj) ,
* 那么 由 ak > aj,所以 min(ai, aj, ak) =min(ai, aj) ,
* 所以由i, k构成的容器的容积C' = min(ai, aj) * (k - i) > C,
* 与C是最值矛盾,所以得证j的后边不会有比它还高的线;
*
* ②:同理,在i的左边也不会有比它高的线;这说明什么呢?
* 如果我们目前得到的候选: 设为 x, y两条线(x< y),那么能够得到比
* 它更大容积的新的两条边必然在[x, y]区间内并且 ax' >= ax , ay' >= ay;
*
* 3.所以我们从两头向中间靠拢,同时更新候选值;在收缩区间的时候优先从
* x, y中较小的边开始收缩;
public int maxArea(int[] height) {

// 参数校验
if (height == null || height.length < 2) {
return 0;
}


// 记录最大的结果
int result = 0;

// 左边的竖线
int left = 0;
// 右边的竖线
int right = height.length - 1;

while (left < right) {
// 设算当前的最大值
result = Math.max(result, Math.min(height[left], height[right]) * (right - left));
// 如果右边线高
if (height[left] < height[right]) {
int k = left;
// 从[left, right - 1]中,从左向右找,找第一个高度比height[left]高的位置
while (k < right && height[k] <= height[left]) {
k++;
}

// 从[left, right - 1]中,记录第一个比原来height[left]高的位置
left = k;
}
// 左边的线高
else {
int k = right;
// 从[left + 1, right]中,从右向左找,找第一个高度比height[right]高的位置
while (k > left && height[k] <= height[right]) {
k--;
}

// 从[left, right - 1]中,记录第一个比原来height[right]高的位置
right = k;
}
}

return result;
}

相关文章

  • 找两条竖线然后这两条线以及X轴构成的容器能容纳最多的水

  • matplotlib色彩填充之fill、fill_between

    fill可以填充两条线之间的色彩 结果如图 fill_between填充x轴与两条y轴 fill_between可...

  • 容纳最多的水

    题目需求 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 ...

  • 人生坐标

    大家都知道坐标是数学中的一个图象,由标有方向的横线X轴和竖线y轴正交叉构成。交点为零,方向为正值,交点后面为负值。...

  • 一次函数的性质

    一次函数作图的步骤在于首先先描出两条坐标轴,即x轴与y轴,注:X轴y轴上要加箭头 然后加上单位,最重要的莫过于零,...

  • 11. 盛最多水的容器

    摘要 如题意,垂直的两条线段将会与坐标轴构成一个矩形区域,较短线段的长度将会作为矩形区域的宽度,两线间距将会作为矩...

  • 11. Container With Most Water

    题意 给定n个非负整数,其中每个数表示坐标点,i是数组下标,是对应高度.寻找两条线,使得两条线构成的长方形面积最大...

  • 被遗忘的与被毁灭的

    人生路上遇到的某个人,可能就是两条规整的X射线,两条线从起点各自出发,然后再慢慢靠近,在重逢点之后朝着不同的方向各...

  • 盛最多水的容器

    给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直...

  • 盛最多水的容器

    盛最多水的容器 给定n个非负整数a1,a2,...,an,每个数代表坐标中的一个点(i,ai) 。画n条垂直线,使...

网友评论

      本文标题:找两条竖线然后这两条线以及X轴构成的容器能容纳最多的水

      本文链接:https://www.haomeiwen.com/subject/owzlnttx.html