11.盛最多水的容器

1.題目簡介

題目鏈接:
https://leetcode-cn.com/problems/container-with-most-water/
題目描述:
給定 n 個(gè)非負(fù)整數(shù) a1,a2,...,an,每個(gè)數(shù)代表坐標(biāo)中的一個(gè)點(diǎn) (i, ai) 。在坐標(biāo)內(nèi)畫 n 條垂直線,垂直線 i 的兩個(gè)端點(diǎn)分別為 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構(gòu)成的容器可以容納最多的水。

說明:你不能傾斜容器,且 n 的值至少為 2。


image

圖中垂直線代表輸入數(shù)組 [1,8,6,2,5,4,8,3,7]。在此情況下,容器能夠容納水(表示為藍(lán)色部分)的最大值為 49。

示例:

輸入: [1,8,6,2,5,4,8,3,7]
輸出: 49

2.解題思路

2.1.暴力解法

數(shù)組的長度為n,組成的矩形區(qū)域的面積共需要考慮n(n-1)/2種情況,在這n(n-1)/2個(gè)結(jié)果中取最大值,用雙層for循環(huán)即可解決。
這種解題思路是沒問題的,不過在leetcode上提交超時(shí)了,而且我寫的代碼也不是最簡潔的,有很多冗余的代碼
先看一下我寫的

   public static int maxArea(int[] height) {
        int t =0;
        if (height.length==2) {
            return Math.min(height[0],height[1]);
        }
        int length = height.length*(height.length-1)/2;
        int[] temp =new int[length];
        for (int i = 0; i <height.length-1 ; i++) {
            for (int j = i+1; j <height.length ; j++) {
                if (t>=length) {
                    break;
                }
                temp[t]= (j-i)*Math.min(height[j],height[i]);
                t++;
            }
        }
        Arrays.sort(temp);
        return temp[length-1];

    }

這段代碼額外引入了一個(gè)長度為n(n-1)/2的數(shù)組,為了填充temp數(shù)組,引入了一個(gè)變量t,進(jìn)行計(jì)數(shù)。在運(yùn)行測試用例的時(shí)候,也需要排除掉數(shù)組長度n=2的特殊情況。
最終需要排序取最大值。
暴力法寫的也不是最簡潔的。
看一下官方提供的暴力法的代碼:

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層for循環(huán)加一個(gè)maxarea變量就解決了。

2.2.雙指針解法

矩形的面積由長和寬共同決定的,x軸為長,y軸為寬,現(xiàn)在需要求xy的最大值。由暴力解法可知共有n(n-1)/2種情況。
官方給的示例圖中,我們可以看出,面積的最大值會受較短邊的影響,即會受y軸取值大小的影響。
雙指針解法是一個(gè)指針放在最左邊,一個(gè)放在最右邊,將2個(gè)指針往內(nèi)側(cè)移動,這樣
就可以找到最大值。
那么哪個(gè)指針往內(nèi)側(cè)移呢,將值較小的指針往內(nèi)側(cè)移動,為什么要移動較小邊呢,
指針向內(nèi)側(cè)移動,x軸的長度總是會減一格,在x軸的長度必定減小的請求下,只有y軸的值變大,x
y才有可能變大。
如果將較大值的指針向內(nèi)側(cè)移動,留下了較小值的指針,那么移動之后的面積肯定是減小的,如果移動較小邊的指針,還有可能遇到更大的值,這樣才能增加面積。
看一下代碼:

 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;
    }

詳細(xì)解答請看一下下方給出的官方題解鏈接
寫的很清晰
https://leetcode-cn.com/problems/container-with-most-water/solution/sheng-zui-duo-shui-de-rong-qi-by-leetcode/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 需求 給定 n 個(gè)非負(fù)整數(shù) a1,a2,...,an,每個(gè)數(shù)代表坐標(biāo)中的一個(gè)點(diǎn) (i, ai) 。在坐標(biāo)內(nèi)畫 n ...
    惑也閱讀 306評論 0 5
  • 題目:11. 盛最多水的容器 難度:中等 分類:數(shù)組 解決方案:雙指針 今天我們學(xué)習(xí)第11題盛最多水的容器,這是一...
    編程半島閱讀 704評論 0 1
  • 給定 n 個(gè)非負(fù)整數(shù) a1,a2,...,an,每個(gè)數(shù)代表坐標(biāo)中的一個(gè)點(diǎn) (i, ai) 。在坐標(biāo)內(nèi)畫 n 條垂直...
    LeeYunFeng閱讀 740評論 0 50
  • 2018年9月3日。 今天發(fā)現(xiàn)之后的事情會有點(diǎn)多,但是總體還是能接受的。 照例說一個(gè)小故事,小時(shí)候的故事。 在外公...
    便要破了這宿命閱讀 409評論 0 0
  • 什么是心理成長? 首先它不等同于問題解決,但它會促進(jìn)問題解決。心理成長不是一撮而就,它會慢慢的向那個(gè)方向去。 心理...
    董瓊芬閱讀 285評論 0 1

友情鏈接更多精彩內(nèi)容