【アルゴリズムトピックのブレークスルー】ダブルポインタ - 最も多くの水を入れる容器 (4)

目次

1. トピック分析

2. アルゴリズム原理

3. コードの書き方

最後に次のように書きます。


1. トピック分析

トピックリンク: 11. 最も多くの水を保持する容器 - Leetcode 

 このテーマは理解するのが難しいことではありませんが、

両側の柱の耐水量は短辺の柱によって決まります。

保水力はちょうど短いカラムの高さ×幅です。

2. アルゴリズム原理

 この疑問は激しく列挙することができ、2 層の for ループで最大の水容量を確実に見つけることができます。

しかし、中程度の問題として、暴力の使用はタイムアウトになるため、より良い解決策を考えなければなりません。

 ルールを守りましょう:

この図を例として考えてみましょう。

左上の部分を右にトラバースさせると、次の 2 つの状況が発生します。

1. 右側の柱の高さが高くても幅が狭くなると、保水力が低下します。

2. 右の柱が短く、幅が狭くなると保水力が低下します。

明らかに機能していないのですが、

次に、短い方の右を左にトラバースさせると、2 つの状況が発生します。

1. 左側の柱の高さが高く、幅が狭くなると、保水力は小さくなるか、変わらないか、大きくなる可能性があります。

2. 左側の柱が短いと幅が狭くなり、保水力が低下します。

上記2つの状況から判断すると、短辺の柱を途中まで連続的に横断することができ、

毎回発生する最大値を記録し、トラバース後に最大値を取得します。

そして、それを一度通過しただけなので、時間計算量は O(N) に最適化されます。

具体的な方法は、ダブル ポインターを使用して両側を維持することです。 

3. コードの書き方

class Solution {
public:
    int maxArea(vector<int>& height) {
        int left = 0, right = height.size() - 1, maxVal = 0;
        while(left < right) {
            maxVal = max(maxVal, min(height[left], height[right]) * (right - left));
            if(height[left] < height[right]) left++;
            else right--;
        }
        return maxVal;
    }
};

最後に次のように書きます。

以上が今回の記事の内容となります、読んでいただきありがとうございます。

何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。

記事の内容に抜けや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメントエリアで指摘してください〜

おすすめ

転載: blog.csdn.net/Locky136/article/details/131568535