码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode11. 盛最多水的容器

时间:2020-12-10 10:37:40      阅读:1      评论:0      收藏:0      [点我收藏+]

标签:情况   联合   整数   回顾   左移   分析   形式   else   原来   

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. 盛最多水的容器

标签:情况   联合   整数   回顾   左移   分析   形式   else   原来   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!