Given an array arr[] of non-negative integers, where each element arr[i]
represents the height of the vertical lines, find the maximum amount of water that can be contained between any two lines, together with the x-axis.
Note: In the case of a single vertical line it will not be able to hold water.
Examples:
Input: arr[] = [1, 5, 4, 3] Output: 6 Explanation: 5 and 3 are 2 distance apart. So the size of the base is 2. Height of container = min(5, 3) = 3. So, total area to hold water = 3 * 2 = 6.
Input: arr[] = [3, 1, 2, 4, 5] Output: 12 Explanation: 5 and 3 are 4 distance apart. So the size of the base is 4. Height of container = min(5, 3) = 3. So, total area to hold water = 4 * 3 = 12.
Input: arr[] = [2, 1, 8, 6, 4, 6, 5, 5]
Output: 25
Explanation: 8 and 5 are 5 distance apart. So the size of the base is 5. Height of container = min(8, 5) = 5. So, the total area to hold water = 5 * 5 = 25.
Constraints:
1<= arr.size() <=105
1<= arr[i] <=104
Approach 01:
-
C++
-
Python
class Solution { public: int maxWater(vector<int> &heights) { int size = heights.size(); int leftIndex = 0; int rightIndex = size - 1; int maxArea = 0; // Return 0 if there is only one element (no container can be formed) if (size == 1) { return 0; } // Use two-pointer approach to find the maximum water area while (leftIndex < rightIndex) { int width = rightIndex - leftIndex; int height = min(heights[leftIndex], heights[rightIndex]); maxArea = max(maxArea, width * height); // Move the pointer pointing to the shorter height if (heights[leftIndex] < heights[rightIndex]) { ++leftIndex; } else { --rightIndex; } } return maxArea; } };
class Solution: def maxWater(self, heights): size = len(heights) leftIndex = 0 rightIndex = size - 1 maxArea = 0 # Return 0 if there is only one element (no container can be formed) if size == 1: return 0 # Use two-pointer approach to find the maximum water area while leftIndex < rightIndex: width = rightIndex - leftIndex height = min(heights[leftIndex], heights[rightIndex]) maxArea = max(maxArea, width * height) # Move the pointer pointing to the shorter height if heights[leftIndex] < heights[rightIndex]: leftIndex += 1 else: rightIndex -= 1 return maxArea
Time Complexity:
- Two-Pointer Traversal:
The algorithm uses a two-pointer approach, where each pointer moves towards the center of the array. In the worst case, each pointer is moved \( n \) times, where \( n \) is the size of the input array.
- Operations Per Step:
At each step, the algorithm performs a constant amount of work to calculate the area and update pointers.
- Overall Time Complexity:
\( O(n) \).
Space Complexity:
- Extra Variables:
The algorithm uses a constant amount of extra space for variables like
leftIndex
,rightIndex
,maxArea
,width
, andheight
. - Data Structures:
No additional data structures are used, and the input array is not modified.
- Overall Space Complexity:
\( O(1) \).