題目簡析:這題目我覺得是蠻坑爹的,因爲題目的語境要求使得“容器”最大,但是類名卻是maxarea,以及想破頭腦都想不出兩條線如何跟x軸組成容器,經過思考,我覺得這個模型應該是省略容器底部的寬(或者長),假設其爲一個缺省值,那麼問題的重心就從體積這個問題轉化到求側面積——即長乘高(或寬乘高),加上最後一句不能傾斜的提醒,自然是木桶效應,即指a1、a2之最小者將限制木桶高度,用圖拍表示就是
這個底部寬度值x值假設爲缺省值,那麼問題就簡化成再i-a平面中找出最大矩形面積的問題了,即如下圖:
最簡單的方式就是進行一次二階遍歷,複雜度O(n²),但是顯然超時,因此我們可以採取貪心算法。我們先取最大的底長——即n,a0或者an的最小值作爲高,得到第一個maxarea,接着我們讓較短邊(假設是a0邊),不斷往右移動,直至找到一條比a0高的邊ak,那麼我們就有了一個比原來更大的高(也許是ak也許是an,取兩者較小值),雖然此時底長n減少爲n-k,但是我們重新計算此時的面積,看能否找到比原來更大的maxarea,如此這般,最多隻要O(n)的複雜度即可完成遍歷
因此我們可以設置left和right兩個標記,分別從兩端,每次取長度低者,將標記往中間靠攏以獲取一個比原來的高度,並更新maxarea。
以下貼上代碼
class Solution {
public:
int maxArea(vector<int>& height) {
int left=0;
int right=height.size()-1;
int max;
int temparea;
if(height[left]<=height[right])
max=(right-left)*height[left];
else
max=(right-left)*height[right];
int i,j;
while(right>left){
if(height[left]<=height[right]){
for(i=left;i<right;i++){
if(height[i]>height[left])
break;
}
left=i;
}
else{
for(j=right;j>left;j--){
if(height[j]>height[right])
break;
}
right=j;
}
if(height[left]<=height[right])
temparea=height[left]*(right-left);
else
temparea=height[right]*(right-left);
if(temparea>max)
max = temparea;
}
return max;
}
};
Submission Result: Accepted
Runtime: 0 ms
題目鏈接:https://leetcode.com/problems/container-with-most-water/description/