标签:情况 联合 整数 回顾 左移 分析 形式 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;
}
标签:情况 联合 整数 回顾 左移 分析 形式 else 原来
原文地址:https://blog.51cto.com/15047485/2559837