Container with Most Water

Given n non-negative integers a_1, a_2, ..., a_n where each represents a point at coordinate  (i, a_i) . ‘ n ‘ vertical lines are drawn such that the two endpoints of line i is at  (i, a_i) and (i, 0).
Find two lines, which together with x-axis forms a container, such that the container contains the most water.

The program should return an integer which corresponds to the maximum area of water that can be contained ( maximum area instead of maximum volume sounds weird but this is 2D plane we are working with for simplicity ).

Note : You may not slant the container.



Examples :

Input : [1, 5, 4, 3]
Output : 6
Explanation : 
5 and 3 are distance 2 apart. 
So the size of the base = 2. 
Height of container = min(5, 3) = 3. 
So total area = 3 * 2 = 6

Input : [3, 1, 2, 4, 5]
Output : 12
Explanation : 
5 and 3 are distance 4 apart. 
So the size of the base = 4. 
Height of container = min(5, 3) = 3. 
So total area = 4 * 3 = 12

Approach :

Note 1 : When you consider a1 and aN, then the area is (N-1) * min(a1, aN).
Note 2 : The base (N-1) is the maximum possible.
  • This implies that if there was a better solution possible, it will definitely have the Height greater than min(a1, aN).
     Base * Height > (N-1) * min(a_1, a_N)
  • We know that, Base min(a1, aN)
    This means that we can discard min(a1, aN) from our set and look to solve this problem again from the start.
  • If a1 < aN, then the problem reduces to solving the same thing for a2, aN.
  • Else, it reduces to solving the same thing for a1, aN-1

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ code for Max 
// Water Container
#include<iostream>
using namespace std;
  
int maxArea(int A[], int len)
{
    int l = 0;
    int r = len -1;
    int area = 0;
      
    while (l < r)
    {
        // Calculating the max area
        area = max(area, min(A[l],
                        A[r]) * (r - l));
                          
            if (A[l] < A[r])
                l += 1;
                  
            else
                r -= 1;
    }
    return area;
}
  
// Driver code
int main()
{
    int a[] = {1, 5, 4, 3};
    int b[] = {3, 1, 2, 4, 5};
      
    int len1 = sizeof(a) / sizeof(a[0]);
    cout << maxArea(a, len1);
      
    int len2 = sizeof(b) / sizeof(b[0]);
    cout << endl << maxArea(b, len2);
}
  
// This code is contributed by Smitha Dinesh Semwal

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java code for Max 
// Water Container
import java.util.*;
  
class Area{
  
    public static int maxArea(int A[], int len)
    {
        int l = 0;
        int r = len -1;
        int area = 0;
      
        while (l < r)
        {
            // Calculating the max area
            area = Math.max(area, 
                        Math.min(A[l], A[r]) * (r - l));
                          
            if (A[l] < A[r])
                l += 1;
                  
            else
                r -= 1;
        }
        return area;
    }
      
    public static void main(String[] args)
    {
        int a[] = {1, 5, 4, 3};
        int b[] = {3, 1, 2, 4, 5};
      
        int len1 = 4;
        System.out.print( maxArea(a, len1)+"\n" );
      
        int len2 = 5;
        System.out.print( maxArea(b, len2) );
    }
}
  
// This code is contributed by rishabh_jain

chevron_right


Python

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python code for Max 
# Water Container
def maxArea( A):
    l = 0
    r = len(A) -1
    area = 0
      
    while l < r:
        # Calculating the max area
        area = max(area, min(A[l], 
                        A[r]) * (r - l))
      
        if A[l] < A[r]:
            l += 1
        else:
            r -= 1
    return area
  
# Driver code
a = [1, 5, 4, 3]
b = [3, 1, 2, 4, 5]
  
print(maxArea(a))
print(maxArea(b))

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# code for Max 
// Water Container
using System;
  
class Area{
  
    public static int maxArea(int []A, int len)
    {
        int l = 0;
        int r = len -1;
        int area = 0;
      
        while (l < r)
        {
            // Calculating the max area
            area = Math.Max(area, 
                        Math.Min(A[l], A[r]) * (r - l));
                          
            if (A[l] < A[r])
                l += 1;
                  
            else
                r -= 1;
        }
        return area;
    }
      
    // Driver code
    public static void Main()
    {
        int []a = {1, 5, 4, 3};
        int []b = {3, 1, 2, 4, 5};
      
        int len1 = 4;
        Console.WriteLine( maxArea(a, len1));
      
        int len2 = 5;
        Console.WriteLine( maxArea(b, len2) );
    }
}
  
// This code is contributed by Vt_M

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP code for Max 
// Water Container
function maxArea($A, $len)
{
    $l = 0;
    $r = $len -1;
    $area = 0;
      
    while ($l < $r)
    {
        // Calculating the max area
        $area = max($area, min($A[$l],
                    $A[$r]) * ($r - $l));
                          
            if ($A[$l] < $A[$r])
                $l += 1;
                  
            else
                $r -= 1;
    }
    return $area;
}
  
// Driver code
$a = array(1, 5, 4, 3);
$b = array(3, 1, 2, 4, 5);
  
$len1 = sizeof($a) / sizeof($a[0]);
echo maxArea($a, $len1). "\n";
  
$len2 = sizeof($b) / sizeof($b[0]);
echo maxArea($b, $len2);
      
// This code is contributed by mits
?>

chevron_right



Output :

6
12


My Personal Notes arrow_drop_up


If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : Mithun Kumar