题目描述:
给定n个非负整数a1,a2,…,an,其中每个数字表示坐标(i, ai)处的一个点。以(i,ai)和(i,0)(i=1,2,3…n)为端点画出n条直线。你可以从中选择两条线与x轴一起构成一个容器,最大的容器能装多少水?
注意:你不能倾斜容器
例如:
输入 [1,8,6,2,5,4,8,3,7]
输出: 49
解题思路:
由题述可知,两条线与x轴一起构成的容器的面积等于两条线之间的距离与两条线高度的最小值之间的乘积。
在解答本题时并没有使用任何算法,传统的思路,一个个比较:
class Solution {
public:
/**
*
* @param height int整型vector
* @return int整型
*/
int maxArea(vector<int>& height) {
int output=0;
int len=height.size();
for(int i=0;i<len;i++){
for(int j=i+1;j<len;j++){
int width=j-i;
int heit=min(height[i],height[j]);
int vol=width*heit;
output=max(output,vol);
}
}
return output;
}
};
note:
其他同学的想法:从两边逼近,且每次放弃短板:
class Solution {
public:
int maxArea(vector<int> &height) {
int l,r,Max=-9999;
for(l=0,r=height.size()-1;l<r;)
{
Max=max(Max,(r-l)*min(height[l],height[r]));
height[l]<height[r]?l++:r--;
}
return Max;
}
};
更简洁,在能解决问题的同时,要学会找最优解。