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.
Subscribe to see which companies asked this question.
1
算法思想,计算每个面积求出最大值
class Solution {
public:
int maxArea(vector<int>& height) {
int areaMax=-1;
for(int i=0;i<height.size()-1;i++){
for(int j=i+1;j<height.size();j++){
areaMax=max(areaMax,min(height[i],height[j])*(j-i));
}
}
return areaMax;
}
};
在大数据情况下超时
2 改进算法思想
现假定取得最大面积的坐标为(i,height[i])(j,height[j]),其中i<j,
则areaMax=max(areaMax,min(height[i],height[j])*(j-i)),由此可推知在j的右端没有一条线比它高,设k>j,且height[k]>height[j],min(height[i],height[k])=
min(height[i],height[j]),则areaMax'=
max(areaMax,min(height[i],height[j])*(k-i))>areaMax,与原假设矛盾。
同理可知,i的左端没有一条线比它低
#include <iostream>
#include <vector>
#include "math.h"
using namespace std;
class Solution {
public:
int maxArea(vector<int>& height) {
int areaMax=-1;
int i=0,j=height.size()-1;
// for(int i=0;i<height.size()-1;i++){
// for(int j=i+1;j<height.size();j++){
// areaMax=max(areaMax,min(height[i],height[j])*(j-i));
// }
// }
while(i<j){
areaMax=max(areaMax,min(height[i],height[j])*(j-i));
if(height[i]>height[j]){
j--;
}else{
i++;
}
}
return areaMax;
}
};
int main(){
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(1);
Solution sol;
int result=sol.maxArea(v);
cout<<result;
return 0;
}