題目:
給定 n 個非負整數 a1,a2,…,an,每個數代表座標中的一個點 (i, ai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別爲 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。
Java:
class Solution {
public int maxArea(int[] height) {
int l=0;
int r=height.length-1;
int v;
int maxv=0;
while(l!=r){
if(height[l]<height[r]){
v=(r-l)*height[l];
l++;
}
else{
v=(r-l)*height[r];
r--;
}
maxv=maxv>v?maxv:v;
}
return maxv;
}
}
c
int maxArea(int* height, int heightSize){//雙指針法
int l=0;//左
int r=heightSize-1;//右
int v;//中間變量
int maxv=0;//最大
while(l!=r){
if(height[l]<height[r]){
v=(r-l)*height[l];
l++;//如果上一句前面便跳過第一個(下:最後一個)節點
}
// if(height[l]>height[r]){
// v=(r-l)*height[r];
// r--;
// }(如果有if,則時間複雜度增加o(n),成爲2o(n),else用來減少時間複雜度)
else{
v=(r-l)*height[r];
r--;
}
maxv = maxv > v ? maxv : v ;
}
return maxv;
}
這個題用的雙指針法。
想要得到盛最多水的容器,一方面要考慮他的寬度,一方面要考慮他的高度。
兩方面都要考慮,所以可以先設定一個初值,max,來記錄每次指針移動後的盛水的量,然後移動兩端相比最小的那一邊(已確保高度最大),直至遍歷一遍(right==left),將得到的max輸出即可。