42. Trapping Rain Water

Mono Stack

```java
class Solution {
    public int trap(int[] height) {
        int n = height.length;
        Stack<Integer> stack = new Stack<>(); // index
        int result = 0;
        for (int i = 0; i < n; i++) {
            while (!stack.isEmpty() && height[stack.peek()] < height[i]) {
                int base = height[stack.pop()];
                if (!stack.isEmpty()) {
                    int leftBoundIndex = stack.peek();
                    int leftHeight = height[leftBoundIndex];
                    result += (Math.min(height[i], leftHeight) - base)*(i - leftBoundIndex - 1);
                }
            }
            stack.push(i);
        }
        return result;
    }
}

/***

min(hi, left side) - base idea

2,1,0,1,3
    x x x

        3
2.x x x 3  
2 1 x 1 3
2 1 0.1 3 
      curH
    base = pop
  left = peek

  (min(leftH, curH) - base)* (index diff)


        3
2.x x x 3
2 1 x 1 3

3.  cur H
   1 -> base
1. -> peek
2  -> peek

min(3, 1) - base (1) = 0
min(3, 2) - base (1) = 1

 */
```

Two pointers

-----

if (h[left] < h[right] )

ๆœ€ๅทฆ้–‹ๅง‹ๆ‰พๆœ€ๅคง็š„ left, left++

else

ๆœ€ๅณ้–‹ไฝฟๆ‰พๆœ€ๅคง็š„ right, right--

็›ฎ็š„ๆ˜ฏ็‚บไบ†ๆ‰พๅˆฐ descending ็š„ๆ™‚ๅ€™, ไนŸๅฐฑๆ˜ฏๆœ‰็ฉๆฐด, ๆ นๆœฌไธ็”จ็ฎกไธญ้–“็š„ๅ€ผ

็œ‹ๆœ€ๅทฆ ๆœ€ๅณๅฐฑๅพ—ๅพ—็Ÿฅ

descending!

ๅ…ถๅฏฆๅทฆ ่ทŸ ๅณๅš็š„ไบ‹้›ทๅŒ, ๆ‰€ไปฅๅชๆ˜ฏ่ฎŠๆ•ธๆ”นๆˆ right, right--

if (height[left] < height[right]) { // ๅ› ็‚บๅทฆ้‚Šๆฏ”่ผƒๅฐ, ๅ…ˆๅš left
    ....
    left++;
class Solution {
    public int trap(int[] height) {
        // two pointers
        // h[left] > h[right]
        // leftmax > h[left] => res += leftmax - res
        int left = 0;
        int right = height.length - 1;
        int leftMax = 0;
        int rightMax = 0;
        int res = 0;
        while (left < right) {
            if (height[left] < height[right]) {
                leftMax = Math.max(leftMax, height[left]);
                res += leftMax - height[left];
                left++;
            } else {
                rightMax = Math.max(rightMax, height[right]);
                res += rightMax - height[right];
                right--;
            }
        }
        return res;
    }
}

ๅฆ‚ๆžœๆ˜ฏ็”จ left right ๆŒ‡้‡

่ฆ็ฎ—้›จๆฐด้ข็ฉ, ๅฐ left ็š„ๅทฆ้‚Š, ๆˆ‘ๅ€‘ๅช้—œๅฟƒๆœ€ๅคง็š„ maxleft ๆ˜ฏๅคšๅฐ‘ ๏ผˆๅฆ‚ๆžœๆˆ‘ๅ€‘้ƒฝๆฑบๅฎšๆ˜ฏ่ตฐๅทฆ้‚Š็š„่ฉฑ, ๅ› ็‚บๆˆ‘ๅ€‘้ƒฝๆƒณ่ฆๅ–ๆฏ”่ผƒไฝŽ็š„้‚ฃไธ€้‚Š, ๆ‰€ไปฅๅฆ‚ๆžœ max_left ๆฏ”่ผƒๅฐ, ้‚ฃ่ตฐๅทฆ้‚Š็š„ๆฏ”่ผƒๅ’Œ่จˆ็ฎ—

ๅไน‹่ตฐๅณ้‚Š

class Solution {
    public int trap(int[] height) {
        int n = height.length;
        int left = 0;
        int right = n-1;
        int maxLeft = 0;
        int maxRight = 0;
            
        int result = 0;
        while (left < right) {
            maxLeft = Math.max(maxLeft, height[left]);
            maxRight = Math.max(maxRight, height[right]);
            
            if (maxLeft < maxRight) {
                result += maxLeft - height[left];
                left++;
            } else {
                result += maxRight - height[right];
                right--;
            }
        }
        return result;
    }
}

use this

ไธ้Žๆˆ‘่ช็‚บ้€™ๅ€‹่งฃๆณ•ๆฏ”่ผƒๅฅฝๆ‡‚

ๅฆ‚ไฝ•่ƒฝๆง‹ๆˆๆœ‰้›จๆฐดๅ‘ข๏ผŸ ๆ‰พๅทฆ้‚Šๆœ€้ซ˜็š„ ๅ’Œๅณ้‚Šๆœ€้ซ˜็š„, ๆฏ”่ผƒไฝŽ็š„ ๅฏไปฅๆœ‰้›จๆฐด๏ผˆ่ฆๆ‰ฃๆŽ‰่‡ชๅทฑๆœฌ่บซ็š„้ซ˜ๅบฆ

T: O(n)

S: O(n)

class Solution {
    public int trap(int[] height) {
        int n = height.length;
        int[] maxLeft = new int[n];
        int[] maxRight = new int[n];
        
        maxLeft[0] = height[0];
        for (int i = 1; i < n; i++) {
            maxLeft[i] = Math.max(height[i], maxLeft[i-1]);
        }
        maxRight[n-1] = height[n-1];
        for (int i = n-2; i >= 0; i--) {
            maxRight[i] = Math.max(height[i], maxRight[i+1]);
        }
        int result = 0;
        for (int i = 0; i < n; i++) {
            result += Math.min(maxLeft[i] , maxRight[i]) - height[i];
        }
        return result;
    }
}

Last updated