11. Container With Most Water(补上周忘记的那份)
来源:互联网 发布:怎样在手机淘宝上评价 编辑:程序博客网 时间:2024/06/16 05:02
Description:
Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.
Note: You may not slant the container and n is at least 2.
简要题解:
先明确一点: 本题中不同容器的储水量可以用容器较短的一条垂直边与底的乘积大小来比较。储水量大小与乘积大小正相关。
算法的思路是: 先选定两条垂线,它们对应的容器底最长。很显然,这两条垂线是第一条和最后一条垂线;接下来,我们不管怎么改动两条垂线,底的长度只可能减小。因为,对于容器的两条垂线,容器的大小只受限于较短的那条,所以,如果我们选择替换较长的那条垂线的话,新容器较短那条垂线的长度<=原容器较短那条垂线的长度。再加上底的长度只可能减小,这样,容器的大小只会变的越来越小。因此,我们应该考虑替换容器的较短那条垂线。候选的垂线就是夹在容器两条垂线中间的那些垂线。我们采用最简单的按序遍历方式尝试寻找新的垂线,即左边的边顺序往前找替换的边,或右边的边顺序往后赵替换的边。
代码:
class Solution {public: int maxArea(vector<int>& height) { int left = 0, right = height.size() - 1; int currentMost = 0; int temp; while (left < right) { temp = (right - left) * ((height[left] < height[right]) ? height[left] : height[right]); if (currentMost < temp) currentMost = temp; if (height[left] < height[right]) { left++; } else { right --; } } return currentMost; }};