0% completed
Problem Statement
Given an array of positive integers height
, where height[i]
represents the height of the bar
in the elevation map
and each bar has width 1
, return how much water it can trap
after raining.
Examples
Example 1:
- Input: height =
[4, 0, 3, 0, 2]
- Expected Output:
5
- Justification: The first and third bars form a container that traps 3 units of water. The third and fifth bars trap an additional 2 units. Therefore, the total trapped water is 5 units.
Example 2:
- Input: height =
[1, 2, 1, 2, 1]
- Expected Output:
1
- Justification: Water is only trapped between the second and fourth bars, holding 1 unit of water.
Example 3:
- Input: height =
[3, 1, 2, 4, 0, 1, 3]
- Expected Output:
8
- Justification: The first, and fourth bars trap 3 units of water. The fourth, and seventh bars trap an additional 5 units. The total is 8 units of trapped water.
Constraints:
- n == height.length
- 1 <= n <= 2 * 10<sup>4</sup>
- 0 <= height[i] <= 10<sup>5</sup>
Solution
To solve this problem, we'll employ a two-pointer technique, which is efficient for this kind of linear space problem. This approach works by iterating over the elevation map from both ends towards the center, calculating the potential water trap at each step. We believe this method is effective because it allows us to compute the maximum water trapped by considering the minimum height between two points at a time, which is the limiting factor for water trapping. This way, we can efficiently calculate the trapped water without needing to consider all possible containers formed between bars, significantly reducing the computational complexity.
The essence of our approach is to keep track of the left and right maximum heights as we move the pointers towards the center. By comparing these heights, we can determine the amount of water that can be trapped at each step based on the difference between the current height and the minimum of the two maximum heights. This strategy ensures that we only need to pass through the elevation map once, making it a highly efficient solution.
Step-by-Step Algorithm
-
Initialize Pointers and Variables:
- Set two pointers,
left
andright
, to point at the start and end of the array, respectively. - Initialize two variables,
leftMax
andrightMax
, to0
. These will keep track of the maximum height encountered so far from the left and right sides. - Initialize a variable
waterTrapped
to0
. This will accumulate the total amount of water trapped.
- Set two pointers,
-
Iterate Over the Array:
- While the
left
pointer is less than theright
pointer, do the following:- Compare the height at the
left
pointer with the height at theright
pointer. - If the height at
left
is less than the height atright
:- Update
leftMax
to the maximum ofleftMax
and the height at the currentleft
position. - Calculate the water trapped at the current
left
position as the difference betweenleftMax
and the height atleft
, and add it towaterTrapped
. If the difference is negative, add0
instead. - Increment the
left
pointer to move it towards the center.
- Update
- Else (if the height at
right
is less than or equal to the height atleft
):- Update
rightMax
to the maximum ofrightMax
and the height at the currentright
position. - Calculate the water trapped at the current
right
position as the difference betweenrightMax
and the height atright
, and add it towaterTrapped
. If the difference is negative, add0
instead. - Decrement the
right
pointer to move it towards the center.
- Update
- Compare the height at the
- While the
-
Return the Total Water Trapped:
- After the loop terminates (when
left
meetsright
), return thewaterTrapped
variable as the total amount of water trapped.
- After the loop terminates (when
Algorithm Walkthrough
Let's consider the input: height = [3, 1, 2, 4, 0, 1, 3]
.
-
Initialization:
left = 0
,right = 6
,leftMax = 0
,rightMax = 0
,waterTrapped = 0
-
First Iteration:
left = 0
,right = 6
,height[left] = 3
,height[right] = 3
- Since
height[left]
is not less thanheight[right]
, we look to updaterightMax
and calculate water forright
. rightMax
is updated to3
.- No water is trapped because
rightMax
equalsheight[right]
. - Decrement
right
. waterTrapped = 0
.
-
Second Iteration:
left = 0
,right = 5
,height[left] = 3
,height[right] = 1
height[left]
is greater thanheight[right]
, so we updaterightMax
if needed and calculate water forright
.rightMax
remains3
.- Water trapped at
right = 5
is3 - 1 = 2
. - Decrement
right
. waterTrapped = 2
.
-
Third Iteration:
left = 0
,right = 4
,height[left] = 3
,height[right] = 0
rightMax
remains3
.- Water trapped at
right = 4
is3 - 0 = 3
. - Decrement
right
. waterTrapped = 5
.
-
Fourth Iteration:
left = 0
,right = 3
,height[left] = 3
,height[right] = 4
leftMax
remains3
.- No water is trapped because
leftMax
equalsheight[left]
. - Increment
left
. waterTrapped = 5
.
-
Fifth Iteration:
left = 1
,right = 3
,height[left] = 1
,height[right] = 4
leftMax
remains3
.- Water trapped at
left = 1
is3 - 1 = 2
. - Increment
left
. waterTrapped = 7
.
-
Sixth Iteration:
left = 2
,right = 3
,height[left] = 2
,height[right] = 4
leftMax
remains3
.- Water trapped at
left = 2
is3 - 2 = 1
. - Increment
left
. waterTrapped = 8
.
-
Seventh Iteration:
- The loop terminates because
left
is no longer less thanright
.
- The loop terminates because
-
Conclusion:
- The total
waterTrapped
is8
.
- The total
Code
Complexity Analysis
Time Complexity
The time complexity of the algorithm is O(n), where n is the number of elements in the input array. This efficiency is achieved because the algorithm makes a single pass through the array, with two pointers moving towards the center from both ends. Each element is accessed exactly once to update the trapped water calculation and the left/right max heights, ensuring linear time complexity.
Space Complexity
The space complexity of the algorithm is O(1). This is because the algorithm uses a constant amount of extra space regardless of the input size.
.....
.....
.....
Table of Contents
Contents are not accessible
Contents are not accessible
Contents are not accessible
Contents are not accessible
Contents are not accessible