Leecode[11] 盛最多水的容器

題目

給你 n 個非負(fù)整數(shù) a1,a2,...,an,每個數(shù)代表坐標(biāo)中的一個點(diǎn) (i, ai) 。在坐標(biāo)內(nèi)畫 n 條垂直線,垂直線 i 的兩個端點(diǎn)分別為 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構(gòu)成的容器可以容納最多的水。

思路解析

  • 設(shè)置雙指針,根據(jù)規(guī)則移動指針。
  • 設(shè)置水槽面積位 S(i,j),由于水槽的實(shí)際高度由兩板中的短板決定,則可得面積為 S(i,j)=min(h[i],h[j])×(j?i)。
  • 指針移動時,無論長板或短板收窄一格,都會導(dǎo)致水槽 底邊寬度 -1:
    • 若向內(nèi)移動短板,水槽的短板 min(h[i], h[j]) 可能變大,因此水槽面積可能變大。
    • 若向內(nèi)移動長板,水槽的短板 min(h[i], h[j]) 不變或者變小,因此水槽面積一定小于當(dāng)前水槽面積。
public class Solution {
    public int MaxArea(int[] height) {
        int i=0,j=height.Length-1, res=0;
        while(i<j)
        {
            res=height[i]<height[j]?
            Math.Max(res,(j-i)*height[i++]):
            Math.Max(res,(j-i)*height[j--]);
        }
        return res;
    }
}

舉一反三

求水槽容納最少的水。

public static int MinArea(int[] height)
{
    int i = 0, j = height.Length - 1, res = int.MaxValue;
    while (i < j)
    {
        if (height[i] < height[j])
        {
            res = Math.Min(res, (j - i) * height[i]);
            j--;
        }
        else
        {
            res = Math.Min(res, (j - i) * height[j]);
            i++;
        }
    }

    return res;
}

求容納最少水,就是對數(shù)組進(jìn)行排列,求出最小元素。

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

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