11:盛最多容器的水

题意

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


question_11.jpg

解决方式

双指针

class Solution {
    public int maxArea(int[] height) {
        int ans = 0;
        int left = 0;
        int right = height.length-1;
        while(left<right){
            ans = Math.max(ans, Math.min(height[left],height[right])*(right-left));
            // 每次缩小低的(反正需要缩小指针,优先缩小值小的)
            if(height[left]<height[right]) left++;
            else right--;
        }
        return ans;
    }
}

上述方案原理

x端点和y端点【左、右端点】能够容纳水的最大面积为:
Min(height(x),height(y))*(y-x)
假设我们移动较高端点【y】为【y1】,则新的能够容纳水的面积为:
Min(height(x),height(y1))*(y1-x)
我们已知:
y1-x<y-x
因此需要判断当x端点不变得情况下,Min(height(x),height(y))一直为x
因此可以得出:
Min(height(x),height(y1))*(y1-x)<=Min(height(x),height(y))*(y-x)
就能得出结论:移动大值也就是y端点永远不会得到比当前值更大的值,因此这里需要移动小值也就是x端点,可能会变得更大。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容