1. Container With Most Water
https://leetcode.com/problems/container-with-most-water/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.
Difficulty:Medium
Explanation:
1.一个容器能装多少水是由容器的底和高决定的。底的大小由两条线之间的距离决定,而高则是由两条线中短的那一条决定。
2.要找到能装最多的容器,最直接的想法当然是找到距离最远和最短的线最长的两条线就找到了能装最多水的容器。但是,底和高之间并没有相关关系,底变大高可能变大或者变小,高变大底可能变小或变大。因此得找到一个折中的组合,从而得到能装最多水的容器。
3.我们可以用从数组的两边开始向中间逼近的方法去寻找最佳的两条线组合,即从底最长的组合开始。然后保持长的一边位置不变,让短的一边向中间逼近,目的是为了寻找更大的高以得到最大的装水量。虽然底在这个过程中减少了,但是减少的量可能比高增加的量少,从而达到总体的增加。因此这样不断循环寻找肯定能找到装水量最大的组合。
Code:
class Solution {
public:
int maxArea(vector<int>& height) {
int max = 0;
int right = 0, left = height.size()-1;
while (right != left&&right<left)
{
int area = (height[right] > height[left] ? height[left] : height[right])*(left - right);
if (area > max)
{
max = area;
}
if (height[right] <= height[left])
{
right++;
}
else
{
left--;
}
}
return max;
}
};