電源ボタンのブラッシングに関する質問:11。最も多くの水を保持する容器

主題の要件

ここに画像の説明を挿入
ここに画像の説明を挿入

バージョン1:私の直感に基づいていますが残業

class Solution {
    
    
public:
    int maxArea(vector<int>& height) {
    
    
        unsigned MaxArea = 0, beforeHeight = 0, lowerHeight;
        for (unsigned i = 0; i < height.size(); i++)
        {
    
    
            if (height.at(i) <= beforeHeight)
            {
    
    
                continue;
            }
            beforeHeight = height.at(i);
            for (unsigned j = i+1; j < height.size(); j++)
            {
    
    
                lowerHeight = std::min(height.at(i), height.at(j));
                MaxArea = std::max(lowerHeight * (j - i), MaxArea);
            }
        }
        return MaxArea;
    }
};

全体のアイデア

二重層のforループを使用してすべての状況をトラバースし、第1層のforループで剪定するための判断条件を追加します。すべての状況の中で最良のものを見つける

バージョン2:ダブルポインター方式(公式ソリューション)

class Solution {
    
    
public:
    int maxArea(vector<int>& height) {
    
    
        unsigned lp = 0, rp = height.size() - 1, maxArea = 0;
        while (lp < rp)
        {
    
    
            maxArea = std::max(maxArea, std::min(height.at(lp), height.at(rp)) * (rp - lp));
            height.at(lp) > height.at(rp) ? --rp : ++lp;
        }
        return maxArea;
    }
};

全体のアイデア

最初に、2つのポインターを設定します。1つは配列の先頭を指し、もう1つは配列の末尾を指します。現在の最大面積を0に初期化します。

現在の2つのポインタの位置に基づいて新しい面積が計算され、現在の最大面積は次のように設定されます。
当前最大面积 = max(当前最大面积,新面积)

次に、2つのポインターを移動して、高さが小さいポインターを取得します。

  • 左が右よりも高い場合は、右ポインタを1つ左に移動します
  • 左が右より低い場合は、左のポインタを1つ右に移動します

新しい面積を再度計算し、現在の最大面積の値を変更してから、2つのポインターが一致するまで再度移動します。

学んだこと

1.初めてダブルポインタメソッドに触れたとき
2.三元式の記述に精通している:boolexp?exp1:exp2;

結果

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/youyadefeng1/article/details/113406139