先是說一說對這道題的理解吧,常規的容器的容量是由最短的邊決定的,所以應該取左右兩邊的最短邊減去底高就是容量,所以理想狀態是將陣列遍歷一次,知道每乙個低是否有容量,例如l與r是容器的兩邊,且l比r小,故l決定了容量,設x為容器底,則l-x,會出現兩種情況,一是整數,則可以知道容量是多少;二是負數,即這個低比l要高,所以這時候容量應該為0,且這時候l應該變為x即l=x,成為新的容器邊,探索下面的低的容量。故我們可以用v=0初始化,然後每次求出容量的時候進行加入,統計出總容量。
這種方法的時間複雜度為o(n),空間複雜度為o(1)。其中需要注意的就是v的取值範圍。不然容易會出現溢位問題。
public class solution ;
long result = maxwater(arr);
system.out.println(result);
}/**
* max water
** @param arr int整型一維陣列 the array
* @return long長整型
*/public static long maxwater(int arr)
long value = 0;
int lmax = arr[0], rmax = arr[length - 1], l = 1, r = length - 2;
while (l <= r) else
}return value;}}
容器盛水問題
給定乙個直方圖 也稱柱狀圖 假設有人從上面源源不斷地倒水,最後直方圖能存多少水量?直方圖的寬度為 1。上面是由陣列 0,1,0,2,1,0,1,3,2,1,2,1 表示的直方圖,在這種情況下,可以接 6 個單位的水 藍色部分表示水 感謝 marcos 貢獻此圖。示例 輸入 0,1,0,2,1,0,1...
盛最多水的容器
給定 n 個非負整數 a1,a2,an,每個數代表座標中的乙個點 i,ai 畫 n 條垂直線,使得垂直線 i 的兩個端點分別為 i,ai 和 i,0 找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。注意 你不能傾斜容器,n 至少是2。乍一看很簡單,巢狀迴圈遍歷就完事了 int m...
盛最多水的容器
題目描述 給定 n 個非負整數 a1,a2,an,每個數代表座標中的乙個點 i,ai 在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 i,ai 和 i,0 找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水 說明 你不能傾斜容器,且 n 的值至少為 2。示例 輸入 1,8,6...