1. 程式人生 > >Container With Most Water (求兩條線和x軸能夠圍城最大面積)

Container With Most Water (求兩條線和x軸能夠圍城最大面積)

有一個數組  num[]={a1,a2,a3,.....an};

假設每一個元素的小標對應x軸上的點,而ai表示y軸的點(即高度)

明顯可以用暴力法:求的每一個ai作為起點的最大面積,時間複雜度為n^2,程式碼如下

<span style="font-size:18px;">class Solution {
public:
    int maxArea(vector<int> &height) {
        
       int i,j;
        int temp;
        int sum=0;
        
        for(i=0;i<height.size()-1;i++)
        {
            temp=0;
            for(j=i+1;j<height.size();j++)
            {
                temp=min(height[i],height[j])*(j-i);
                if(temp>sum)
                    sum=temp;
            }
        }
        return sum;
}</span>

接下來求一個時間複雜度為n的方法。

如下圖 a0~a6   分別為  2,1,1,2,5,3,4



要求最大值,從開頭(s)和結尾(e)開始,因為此時長度最大(e-s最大)

此時面積為 min(a[s],a[e])*(e-s)。因為a[s]和a[e]之間的面積由最小值決定。

所以一次就求出來了以a[s],a[e]作為邊界的最大面積。

如上圖所示,    s=0,e=6      a[s]=2,a[e]=4   那麼 此時以 a[0]作為邊界的最大面積就是   2*6 =12,下面再也找不出來 比a[0]作為邊界更大的面積  因為此時  長度已達最大,並且a[0]<a[6] ,以小的為準。

所以,我們繼續推進,因為此時a[0]作為邊界的最大值已經求的,那麼整個陣列就不再與a[0]有關係,所以s++,0變成1.  同理如果a[e]較小,應該e--

迴圈  上面  繼續求的  min(a[1],a[6])  *  (6-1)       a1<a6             對於剩下的 a1~a6 來說,此時求的a1為邊界的最大面積

程式碼如下 

<span style="font-size:18px;">class Solution {
public:
    int maxArea(vector<int> &height) {
     
        
        int sum=0;
        
        int l=0;
        int m=height.size()-1;
        
        while(l<m)
        {
            int temp=min(height[l],height[m])*(m-l);
            
            if(temp>sum)
                sum=temp;
                
            if(height[l]<height[m])
                l++;
            else
             m--;
        }
        
        return sum;
        
        
    }
};</span>