題目
給你 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)成的容器可以容納最多的水。
思路解析
- 設(shè)置雙指針揣炕,根據(jù)規(guī)則移動(dòng)指針帘皿。
- 設(shè)置水槽面積位 S(i,j),由于水槽的實(shí)際高度由兩板中的短板決定畸陡,則可得面積為 S(i,j)=min(h[i],h[j])×(j?i)鹰溜。
- 指針移動(dòng)時(shí)虽填,無論長板或短板收窄一格,都會(huì)導(dǎo)致水槽 底邊寬度 -1:
- 若向內(nèi)移動(dòng)短板曹动,水槽的短板 min(h[i], h[j]) 可能變大斋日,因此水槽面積可能變大。
- 若向內(nèi)移動(dòng)長板墓陈,水槽的短板 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;
}
求容納最少水兔港,就是對(duì)數(shù)組進(jìn)行排列,求出最小元素仔拟。