Container With Most Water (求兩條線和x軸能夠圍城最大面積)
阿新 • • 發佈:2019-01-26
有一個數組 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>