この問題は線形時間で解くことができます。
考えられる左の壁 (位置と高さのペア) のリストを、高いものから低いものの順に作成します。これは、最も左にある可能性のある壁を取得してリストに追加し、可能なすべての壁を左から右に調べ、最後にリストに追加された壁よりも大きいすべての壁を取得することによって行われます。たとえば、配列の場合
2 5 4 7 3 6 2 1 3
考えられる左の壁は次のようになります (ペアは (pos, val)):
(3, 7) (1, 5) (0, 2)
同じ方法で可能な右壁のリストを作成しますが、右から左に進みます。上記の配列の場合、考えられる右の壁は次のようになります。
(3, 7) (5, 6) (8, 3)
2 つのリストの前にある壁の高さの最小値である、できるだけ高い水位から始めます。これらの壁を使用して水の総量を計算し (マイナスまたはゼロの場合もありますが、それで問題ありません)、リストの 1 つから要素をポップして水位を下げ、水位の低下が最も少なくなるようにします。これらの高さのそれぞれで可能な水量を計算し、最大値を取ります。
これらのリストでこのアルゴリズムを実行すると、次のようになります。
L: (3, 7) (1, 5) (0, 2) # if we pop this one then our water level drops to 5
R: (3, 7) (5, 6) (8, 3) # so we pop this one since it will only drop to 6
Height = 7
Volume = (3 - 3) * 7 = 0
Max = 0
L: (3, 7) (1, 5) (0, 2) # we pop this one now so our water level drops to 5
R: (5, 6) (8, 3) # instead of 3, like if we popped this one
Height = 6
Volume = (5 - 3) * 6 = 12
Max = 12
L: (1, 5) (0, 2)
R: (5, 6) (8, 3)
Height = 5
Volume = (5 - 1) * 5 = 20
Max = 20
L: (1, 5) (0, 2)
R: (8, 3)
Height = 3
Volume = (8 - 1) * 3 = 21
Max = 21
L: (0, 2)
R: (8, 3)
Height = 2
Volume = (8 - 0) * 2 = 16
Max = 21
ステップ 1、2、および 3 はすべて線形時間で実行されるため、完全な解にも線形時間がかかります。