盛最多水的容器
給你 n 個非負整數 a1,a2,…,an,每個數代表座標中的一個點 (i, ai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別爲 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。
說明:你不能傾斜容器,且 n 的值至少爲 2。
暴力法
- 固定,尋找right,使得或最大。時間複雜度爲,空間複雜度爲。
- 代碼如下
int maxArea(int* height, int heightSize){
int max_warter=0;
for(int left=0;left<heightSize;left++){
for(int right=left+1;right<heightSize;right++){
if(height[left]<height[right]){
max_warter=max(max_warter,height[left]*(right-left));
}else
max_warter=max(max_warter,height[right]*(right-left));
}
}
return max_warter;
}
貪心法
- 一個區間能夠容納水的面積=區間長度*min(左端點高度,右端點高度)
- 如果min(左端點高度,右端點高度)相同則區間長度越大,能夠容納的水越多。如果區間長度相同,則min(左端點高度,右端點高度)越大,能夠容納的水越多。
- 如果想讓面積最大則要麼增加區間長度,要麼使得min(左端點高度,右端點高度)增大。
- 如果從最長區間開始依次縮小區間,而每次要縮小區間時,選擇留下高度最高的端點,就可以使得min(左端點高度,右端點高度)越大(捨去的區間的能夠容納的水一定比選擇的區間容納的水更少)。
- 每次縮小區間要更新當前能夠容納水的最大面積
max_warter=max(max_warter,(right-left)*min(height[left],height[right]));
- 時間複雜度爲,空間複雜度爲。
- 代碼如下
int maxArea(int* height, int heightSize){
int left=0,right=heightSize-1;
int max_warter=0;
while(left<right){
max_warter=max(max_warter,(right-left)*min(height[left],height[right]));
if(height[left]>height[right]){
right--;
}else{
left++;
}
}
return max_warter;
}