问题描述:
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.
思路:在这个问题中,我们要找到一个容器包含最多的点,如何解决这个问题呢?我们举个例子:
在上图中,我们一共有10个数据,我们要找两条线和x轴一起形成一个容器,使得这个容器最大,很明显不能是0到9这两条线,因为0的值是0,所以这个容器是0,因为9的值比较大(8),我们不可能把9移到8,而是选择左边的线用1,那么此时容器的面积是
6∗8=48
当然有没有可能产生更大的容器呢?我们继续缩小宽度,对于左边来说,只有到3的时候才有可能比刚才的面积大,右边暂时不用挪,因为没有比它更大的,根据这样计算,最大的面积就是48了。然后我们可以开始写程序了。
代码:
#include<iostream>
#include<vector>
#include<cstdlib>
#include<ctime>
#include<fstream>
using namespace std;
int maxArea(vector<int>& height){
int water = 0;
int i = 0,j = height.size() - 1;
while(i < j){
int h = min(height[i],height[j]);
water = max(water,(j - i)*h);
while(height[i] <= h && i < j) i++;
while(height[j] <= h && i < j) j--;
}
return water;
}
int main(){
vector<int> height;
srand(unsigned(time(0)));
for(int i = 0; i < 10; i++){
height.push_back(rand()%10);
}
cout<<"height"<<endl;
for(int i = 0; i < height.size(); i++){
cout<<height[i]<<" ";
}
cout<<"water: "<<maxArea(height)<<endl;
//save the data
ofstream SaveFile("height.txt");
for(int i = 0; i < height.size(); i++){
SaveFile << height[i];
SaveFile << " ";
}
SaveFile.close();
}
运行时间: O(n)