You are given an integer array height of length n. There are n vertical lines drawn such that the two endpoints of the ith line are (i, 0) and (i, height[i]). Find two lines that together with the x-axis form a container, such that the container contains the most water. Return the maximum amount of water.
height = [1,8,6,2,5,4,8,3,7]49height = [1,1]1Width decreases as pointers move inward. To possibly increase area, need greater height. The shorter wall limits height — moving it may find a taller wall. Moving the taller wall can only decrease or maintain height with a smaller width — it never helps. So we always move the shorter wall inward, guaranteeing we never miss the optimal pair.
Checking every pair is O(n²). And picking the two tallest lines fails, because the width matters too.
Start with the widest container, one pointer at each end. The water level is set by the shorter line, so moving the taller line inward can never help. So always move the shorter line inward, and keep the best area.
Start widest, and always move the shorter line. The shorter line limits the water.
Run the animation above on your own input, or watch the 1:29 video explanation of Container With Most Water with a dry run and Java code.