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--

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

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

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

use this

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

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

T: O(n)

S: O(n)

Last updated