[アルゴリズム - ダブル ポインター] LeetCode 11 最も多くの水を保持する容器

トピックの説明:

問題解決のアイデア:

        写真が示すように:

        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;
    }
};

結果:

おすすめ

転載: blog.csdn.net/weixin_44906102/article/details/132396031