タイトル
所与\(N \)非負整数\(A_1、A_2、\ cdots、A_N \) 、各座標点表す\((I、a_iを)\) 、\(N \) vetical線が、このような描かれているがラインの2つのエンドポイントこと\が(私は\)である\((I、a_iを)\)と\((I、0)\) 。一緒に、x軸と容器がほとんど水を含むように、容器を形成する2つの行を見つけます。
注:あなたは、容器と傾斜しないことがあり、\(N \)を少なくとも2です。
考え
1アイデア:マッチング暴力
セグメントの各組み合わせの発生を考慮すると、これらの組み合わせの下で最大の面積を算出します。
2つのアイデア:指ビス
ダブルポインタ方法:単一のポインタを使用してアレイを介して、一般的に、アレイを横断する二つのポインタを使用して。通常、2つのポインタの順序付けられた配列、同じ方向又は横断終了の2つの反対方向にポインタ。(C内のポインタは、ここではポインタが、群屈折率の指標ではない)
、本明細書のアイデア:つのセグメントの長い距離、より大きな領域と、同じ時間は、コンテナ領域は、より短い長さの制限断片によって線分との間に形成されています。
ダブルポインタ配列、配列の先頭へのポインタ、エンドへのポインタで。形成された線分の領域を計算し、そして洗浄し\(最大\)これまでに得られた記憶するための最大領域。さらに、ポインタの移動方向は、ポインタは、より長いセグメントの短いセグメントポインタに移動します。
長方形の容器の領域は、線分の短い長さによって制限されるので、線分、矩形領域の短セグメントへのポインタの移動が増加しない場合に長くなります。長方形の幅の影響を低減しつつ、短いセグメントポインタの動きが、しかし、ポインタの動きの方向が短いセグメントポインタ長いセグメント、矩形大きい高さに移動させるであろうしかし、これもよいです面積が大きくなってしまいます。
C ++
- アイデア1
int maxArea(vector<int>$ height){
int max = 0;
for(int i = 0; i< height.size(); i++){
for(int j = 0; j< height.size(); j++){
int wide = height[i] > height[j] ? height[j] : height[i];
int len = j - i;
int temMax = len * wide;
if(tempMax > max)
max = tempMax;
}
}
return max;
}
- アイデア2
int maxArea(vector<int>& height){
int pBegin = 0; //开始指针
int pEnd = height.size() - 1; //末尾指针
int max = 0;
while(pBegin < pEnd){
int minHeight = height[pBegin] < height[pEnd] ? height[pBegin] : height[pEnd];
int tempMax = minHeight * (pEnd - pBegin);
if (tempMax > max)
max = tempMax;
if (height[pBegin] < height[pEnd]){
pBegin ++;
}
else{
pEnd --;
}
}
return max;
}
パイソン
- アイデア2
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
pBegin = 0
pEnd = len(height) - 1
resInt = 0
while pBegin < pEnd:
curArea = (pEnd - pBegin) *min(height[pBegin], height[pEnd])
if curArea > resInt:
resInt = curArea
if height[pBegin] < height[pEnd]:
pBegin += 1
else:
pEnd -= 1
return resInt