Leetcode —— 11.盛最多水的容器

题目:

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。

思路:

最容易想到的方法是双for暴力循环,记录最大值。这种方法的时间复杂度会达到O(n^2)

改进之后使用双指针方法,即在数组height数组头尾插入指针lk以及rk。考虑每次移动其中一个指针,直至lk >= rk。

有短板效应,我们容易得到,最多可容纳的水为maxNum = min(height[lk],height[rk]) * (rk-lk);也就是说,我们假设height[rk]是当前小的一方,则可以得到由边界rk组成的容器在当前状态下是容量最大的。下面给出证明:

因为height[rk]最小,如果将lk向内+1,下面会出现两种情况,

a.一种情况是height[lk+1]

那么lk移动之后的容器大小为height[lk+1]*(rk-lk-1),

由于rk-lk>rk-lk-1

则最终lk移动后的容器容量一定小于移动之前的。

b.另外一种情况是height[lk+1]>=height[rk]

这种情况移动之后的容器大小为height[rk]*(rk-1-lk),很容易看出,容器的高没有边,但是长度变小了,容器体积变小。

综上所述,如果height[rk]是当前小的一方,则针对rk的容器体积在此时达到最大,我们就需要去寻找针对lk的容器最大的情况,则必须将rk--,排除rk的情况。直至lk>=rk。

代码:

class Solution {
    public int maxArea(int[] height) {
        int lk = 0;
        int rk = height.length - 1;
        int maxNum = 0;
        int square = 0;
        while(lk

你可能感兴趣的:(leetcode,算法,职场和发展)