1. 程式人生 > >【LeetCode】Container With Most Water 解題報告

【LeetCode】Container With Most Water 解題報告

【題目】

Given n non-negative integers a1a2, ..., an, where each represents a point at coordinate (iai). n vertical lines are drawn such that the two endpoints of line i is at (iai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.

Note: You may not slant the container.

【解析】

題意:在二維座標系中,(i, ai) 表示 從 (i, 0) 到 (i, ai) 的一條線段,任意兩條這樣的線段和 x 軸組成一個木桶,找出能夠盛水最多的木桶,返回其容積。

兩層 for 迴圈的暴力法會超時,所以儘早放棄這種懶惰的想法。

有沒有 O(n) 的解法?

答案是有,用兩個指標從兩端開始向中間靠攏,如果左端線段短於右端,那麼左端右移,反之右端左移,知道左右兩端移到中間重合,記錄這個過程中每一次組成木桶的容積,返回其中最大的。(想想這樣為何合理?)

public class Solution {
    public int maxArea(int[] height) {
        if (height.length < 2) return 0;
        int ans = 0;
        int l = 0;
        int r = height.length - 1;
        while (l < r) {
            int v = (r - l) * Math.min(height[l], height[r]);
            if (v > ans) ans = v;
            if (height[l] < height[r]) l++;
            else r--;
        }
        return ans;
    }
}

合理性解釋:當左端線段L小於右端線段R時,我們把L右移,這時捨棄的是L與右端其他線段(R-1, R-2, ...)組成的木桶,這些木桶是沒必要判斷的,因為這些木桶的容積肯定都沒有L和R組成的木桶容積大。