LeetCode[11] - 盛最多水的容器

題目

給定 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。


題目

分析

這道題本身并不是很難(其實(shí)我跳過了一題,第十題,實(shí)在是有點(diǎn)智商不夠)

  • 解法1:暴力算法
    兩層for循環(huán)從頭算到尾,提交后擊敗了0.00%的玩家····這個(gè)我就不多討論了···

  • 解法2:分析一下矩形面積與長(zhǎng)和寬相關(guān),我們不妨讓寬為最大,即取數(shù)組兩端(a[0],a[lenght-1]),那么高即為min(a[0],a[lenght-1]),那么我們下組長(zhǎng)寬如何去選取呢?其實(shí)很簡(jiǎn)單,我們將某一端向內(nèi)移動(dòng)一位,那么是哪一端呢?當(dāng)然是選擇短的一端移動(dòng)才有可能得到大的,即:
    如果 a[0]>a[length-1]=>a[0],a[length-2];
    否則 a[0]<a[length-1]=>a[1],a[length-1];
    思路清晰了就可以coding了。

    public int maxArea(int[] height) {
        int res=0;
        int l=0;
        int r=height.length-1;
        while(l!=r){
            res=Math.max(res,Math.min(height[l],height[r])*(r-l));
            if(height[l]>height[r]){
                r--;
            }else{
                l++;
            }
        }
        return res;
    }

提交一下,測(cè)試用例耗時(shí)由幾百毫秒降至8毫秒~~

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

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

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