首页 > 其他 > 详细

leetcode11. 盛最多水的容器

时间:2020-12-05 17:54:10      阅读:32      评论:0      收藏:0      [点我收藏+]
leetcode11. 盛最多水的容器

技术分享图片

作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人

前文回顾:
leetcode1. 两数之和--每天刷一道leetcode系列!
leetcode2. 两数相加--每天刷一道leetcode系列!
leetcode3. 无重复字符的最长子串--每天刷一道leetcode系列!
leetcode4. 寻找两个有序数组的中位数--每天刷一道leetcode系列!
leeetcode5.最长回文子串--每天刷一道leetcode系列!
leetcode 9. 回文数--每天刷一道leetcode系列!

题目描述

给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
技术分享图片
图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例:
输入: [1,8,6,2,5,4,8,3,7]
输出: 49

分析

本题可以采用从两边向中间夹击的形式。每个过程能盛的水的容量为左右两边教矮的高度乘以宽度。并且,如果左边的高度较小。下一次将左边向右移一位。如果右边的高度比较小。下一次将右边左移一位。直到左右两边相遇。

证明如下:

假设左边高度记为height[left],右边高度记为height[right],宽度记为width。此时可盛水min(height[left],height[right])??width。
无论从右向左移动一位,还是从左向右移动一位。宽度都是一样的,为width-1.
上面说的移动方法用一句话概括就是哪边矮移动哪边。
试想如果哪边高就移动哪边,会怎么样?
假设height[left] > height[right],则原来盛水 height[right]??width。则
min(height[++left],height[right]) ??(width-1)<= height[right]??(width-1) < height[right]??width. 也就是移动以后肯定会比移动之前的值。显然是不行的。按照我们的思路哪边矮移动哪边,会怎么样?假设height[left] > height[right],则原来盛水 height[right]??width。
移动以后可盛水min(height[left],height[--right])??(width-1)。
如果height[right-1]的值比height[right]大的话,虽然宽度变小了。但是min(height[left],height[right-1])一定大于height[right],
那么min(height[left],height[right-1])??(width-1)是有可能大于height[right]??width的。

代码

public int maxArea(int[] height) {
        int left = 0;
        int right = height.length - 1;
        int res = 0;
        while (left < right) {
            int width = right - left;
            if (height[left] < height[right]) {
                res = res > height[left] * width ? res : height[left] * width;
                left++;
            } else {
                res = res > height[right] * width ? res : height[right] * width;
                right--;
            }
        }
        return res;

    }

leetcode11. 盛最多水的容器

原文:https://blog.51cto.com/15047485/2559837

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!