トピックの説明:
問題解決のアイデア:
写真が示すように:
1. 最も遠い 2 本の柱が保持できる水の面積を考慮します。幅は 2 つの列間の距離 (8) で、高さは 2 つの列の短い方 (左の列の高さ 3) によって決まります。水の面積は3×8=24です。
2. 1 つの柱を固定し、もう 1 つの柱を変更することを選択した場合、水域が変化します。
- 現在の柱は両側の柱で水の幅が一番大きくなりますが、他の組み合わせでは水の幅はこれより小さくなります。
- 左側の列が短くなっているため、水の高さは 3 になります。左側の柱を移動した場合、新しい水面の高さは不確実であり、右側の柱の高さ (7) を超えることはありません。
- 右側の柱を移動した場合、新しい水面の高さは左側の柱の高さを 3 超えません。つまり、現在の水面の高さを超えません。
3. したがって、左側の柱を固定して右側の柱を移動すると、水の高さは上がらず、幅は確実に減少しますので、水の面積は確実に減少します。このとき、実際には左側の柱と他の柱の組み合わせをなくすことができます。つまり、左側の柱を除外できるということです。
4. 左列を除外するこの操作は、ダブル ポインタ コードでは left++ です。左右のポインタの間の領域は、除外されていない領域です。排除が続くと左右とも中央寄りになる。左と右が一致すると、アルゴリズムは終了します。
コード:
class Solution {
public:
int maxArea(vector<int>& height)
{
int left = 0;
int right = height.size() - 1;
int ret = 0;
while(left < right)
{
int V = (right - left) * min(height[left], height[right]);
ret = max(ret, V);
if(height[left] < height[right])
{
left++;
}
else
{
right--;
}
}
return ret;
}
};