目次
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;
}
};
最後に次のように書きます。
以上が今回の記事の内容となります、読んでいただきありがとうございます。
何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。
記事の内容に抜けや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメントエリアで指摘してください〜