一. Container With Most Water
Given n non-negative integers
Note: You may not slant the container and n is at least 2.
Difficulty:Medium
TIME:30MIN
解法
這道題挺有意思的,題目的意思是x軸上有很多垂直的線段,問哪兩個線段和x軸可以形成一個容器,這個容器可以裝最多的水。也就是說雖然這個容器是一個梯形,但是如果水超過短的線段的話,水就會溢出來,因此說,這道題其實就是求短的線段和兩條垂直線之間的距離的面積。
弄明白意思之後立馬寫了一個
既然不能採用
線段的長度是沒有規律的,但是線段之間的距離卻是有規律,相隔越遠,距離越大,那麼我們完全可以從兩端開始來查找最大的面積。令
- 當
height[i]>=height[j] 的時候,面積就是(j−i)∗height[j] ,這個時候j 向前移動變成j−1 - 當
height[i]<height[j] 的時候,面積就是(j−i)∗height[i] ,這個時候i 向前移動變成i+1
這樣遍歷一次就得到了最大的面積。
當
height[i+1]>=height[j] ,這個時候面積就是(j−i−1)∗height[j] ,顯然一定小於(j−i)∗height[j] height[i+1]<=height[j] ,這個時候面積就是(j−i−1)∗height[i+1] ,也顯然一定小於(j−i)∗height[j]
所以不管怎樣移動
int maxArea(vector<int>& height) {
int i = 0,j = height.size() - 1;
int result = 0;
while(i <= j) {
if(height[i] >= height[j]) {
result = max(result, (j - i) * height[j]);
j--;
}
else {
result = max(result, (j - i) * height[i]);
i++;
}
}
return result;
}
代碼的時間複雜度爲
總結
這道題和之前做過一道題Two Sum很類似,雖然都可以用