Container With Most Water

来源:互联网 发布:中国软件杯大赛 编辑:程序博客网 时间:2024/06/15 03:01

Container With Most Water

问题描述:

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.

思路:在这个问题中,我们要找到一个容器包含最多的点,如何解决这个问题呢?我们举个例子:

water

在上图中,我们一共有10个数据,我们要找两条线和x轴一起形成一个容器,使得这个容器最大,很明显不能是0到9这两条线,因为0的值是0,所以这个容器是0,因为9的值比较大(8),我们不可能把9移到8,而是选择左边的线用1,那么此时容器的面积是

68=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)

原创粉丝点击