【LeetCode】11.盛最多水的容器
阿新 • • 發佈:2019-02-15
題目描述:
給定 n 個非負整數 a1,a2,...,an,每個數代表座標中的一個點 (i, ai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。
說明:你不能傾斜容器,且 n 的值至少為 2。
1.暴力法
考慮每對可能出現的線段組合並找出這些情況之下的最大面積。
public class Solution { public int maxArea(int[] height) { int maxarea = 0; for (int i = 0; i < height.length; i++) for (int j = i + 1; j < height.length; j++) maxarea = Math.max(maxarea, Math.min(height[i], height[j]) * (j - i)); return maxarea; } }
2.雙指標法
演算法思想:兩線段之間形成的區域總是會受到其中較短那條長度的限制。此外,兩線段距離越遠,得到的面積就越大
我們在由線段長度構成的陣列中使用兩個指標,一個放在開始,一個置於末尾。 此外,我們會使用變數 maxarea 來持續儲存到目前為止所獲得的最大面積。 在每一步中,我們會找出指標所指向的兩條線段形成的區域,更新 maxarea,並將指向較短線段的指標向較長線段那端移動一步。
public class Solution { public int maxArea(int[] height) { int maxarea = 0, l = 0, r = height.length - 1; while (l < r) { maxarea = Math.max(maxarea, Math.min(height[l], height[r]) * (r - l)); if (height[l] < height[r]) l++; else r--; } return maxarea; } }