题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:  
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 
 
示例 2: 
输入:height = [4,2,0,3,2,5] 输出:9
 
提示: 
n == height.length 
$1 <= n <= 2 * 10^4$ 
$0 <= height[i] <= 10^5$ 
 
 
解决方法 C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 class  Solution  {public :    int  trap (vector<int >& height)   {         if  (height.size () < 3 ) {             return  0 ;         }         int  left = 0 , right = height.size () - 1 ;         int  left_max = 0 , right_max = 0 ;         int  result = 0 ;         while  (left < right) {             if  (height[left] < height[right]) {                 if  (height[left] >= left_max) {                     left_max = height[left];                 } else  {                     result += left_max - height[left];                 }                 left++;             } else  {                 if  (height[right] >= right_max) {                     right_max = height[right];                 } else  {                     result += right_max - height[right];                 }                 right--;             }         }         return  result;     } }; 
 
结果 执行用时 : 15 ms, 击败 50.80% 使用 C++ 的用户
内存消耗 : 21.66 MB, 击败 17.09% 使用 C++ 的用户
 
Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 public  class  Solution  {    public  int  trap (int [] height)  {         if  (height.length < 3 ) {             return  0 ;         }         int  left  =  0 , right = height.length - 1 ;         int  left_max  =  0 , right_max = 0 ;         int  result  =  0 ;         while  (left < right) {             if  (height[left] < height[right]) {                 if  (height[left] >= left_max) {                     left_max = height[left];                 } else  {                     result += left_max - height[left];                 }                 left++;             } else  {                 if  (height[right] >= right_max) {                     right_max = height[right];                 } else  {                     result += right_max - height[right];                 }                 right--;             }         }         return  result;     } } 
 
结果 执行用时 : 0 ms, 击败 100.00% 使用 Java 的用户
内存消耗 : 45.56 MB, 击败 5.11% 使用 Java 的用户
 
Python 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 class  Solution (object ):    def  trap (self, height ):         """          :type height: List[int]         :rtype: int         """         if  len (height) < 3 :             return  0          left, right = 0 , len (height) - 1          left_max, right_max = 0 , 0          result = 0          while  left < right:             if  height[left] < height[right]:                 if  height[left] >= left_max:                     left_max = height[left]                 else :                     result += left_max - height[left]                 left += 1              else :                 if  height[right] >= right_max:                     right_max = height[right]                 else :                     result += right_max - height[right]                 right -= 1          return  result 
 
结果 执行用时 : 18 ms, 击败 99.40% 使用 Python 的用户
内存消耗 : 12.68 MB, 击败 91.49% 使用 Python 的用户
 
Python3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 class  Solution :    def  trap (self, height: List [int ] ) -> int :         if  len (height) < 3 :             return  0          left, right = 0 , len (height) - 1          left_max, right_max = 0 , 0          result = 0          while  left < right:             if  height[left] < height[right]:                 if  height[left] >= left_max:                     left_max = height[left]                 else :                     result += left_max - height[left]                 left += 1              else :                 if  height[right] >= right_max:                     right_max = height[right]                 else :                     result += right_max - height[right]                 right -= 1          return  result 
 
结果 执行用时 : 47 ms, 击败 94.36% 使用 Python3 的用户
内存消耗 : 17.77 MB, 击败 74.44% 使用 Python3 的用户
 
C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 int  trap (int * height, int  heightSize)  {    if  (heightSize < 3 ) {         return  0 ;     }     int  left = 0 , right = heightSize - 1 ;     int  left_max = 0 , right_max = 0 ;     int  result = 0 ;     while  (left < right) {         if  (height[left] < height[right]) {             if  (height[left] >= left_max) {                 left_max = height[left];             } else  {                 result += left_max - height[left];             }             left++;         } else  {             if  (height[right] >= right_max) {                 right_max = height[right];             } else  {                 result += right_max - height[right];             }             right--;         }     }     return  result; } 
 
结果 执行用时 : 9 ms, 击败 69.17% 使用 C 的用户
内存消耗 : 6.44 MB, 击败 99.08% 使用 C 的用户
 
C# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 public  class  Solution  {    public  int  Trap (int [] height )  {         if  (height.Length < 3 ) {             return  0 ;         }         int  left = 0 , right = height.Length - 1 ;         int  left_max = 0 , right_max = 0 ;         int  result = 0 ;         while  (left < right) {             if  (height[left] < height[right]) {                 if  (height[left] >= left_max) {                     left_max = height[left];                 } else  {                     result += left_max - height[left];                 }                 left++;             } else  {                 if  (height[right] >= right_max) {                     right_max = height[right];                 } else  {                     result += right_max - height[right];                 }                 right--;             }         }         return  result;     } } 
 
结果 执行用时 : 76 ms, 击败 95.76% 使用 C# 的用户
内存消耗 : 44.57 MB, 击败 26.25% 使用 C# 的用户
 
JavaScript 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 var  trap = function (height ) {    if  (height.length  < 3 ) {         return  0 ;     }     let  left = 0 , right = height.length  - 1 ;     let  left_max = 0 , right_max = 0 ;     let  result = 0 ;     while  (left < right) {         if  (height[left] < height[right]) {             if  (height[left] >= left_max) {                 left_max = height[left];             } else  {                 result += left_max - height[left];             }             left++;         } else  {             if  (height[right] >= right_max) {                 right_max = height[right];             } else  {                 result += right_max - height[right];             }             right--;         }     }     return  result; }; 
 
结果 执行用时 : 52 ms, 击败 99.07% 使用 JavaScript 的用户
内存消耗 : 50.02 MB, 击败 25.70% 使用 JavaScript 的用户
 
TypeScript 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 function  trap (height : number [] ): number  {    if  (height.length  < 3 ) {         return  0 ;     }     let  left : number  = 0 , right : number  = height.length  - 1 ;     let  left_max : number  = 0 , right_max : number  = 0 ;     let  result : number  = 0 ;     while  (left < right) {         if  (height[left] < height[right]) {             if  (height[left] >= left_max) {                 left_max = height[left];             } else  {                 result += left_max - height[left];             }             left++;         } else  {             if  (height[right] >= right_max) {                 right_max = height[right];             } else  {                 result += right_max - height[right];             }             right--;         }     }     return  result; } 
 
结果 执行用时 : 70 ms, 击败 72.92% 使用 TypeScript 的用户
内存消耗 : 52.29 MB, 击败 29.22% 使用 TypeScript 的用户
 
PHP 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 class  Solution   {         function  trap ($height  )  {         $length  = count ($height );         if  ($length  < 3 ) {             return  0 ;         }         $left  = 0 ;         $right  = $length  - 1 ;         $left_max  = 0 ;         $right_max  = 0 ;         $result  = 0 ;         while  ($left  < $right ) {             if  ($height [$left ] < $height [$right ]) {                 if  ($height [$left ] >= $left_max ) {                     $left_max  = $height [$left ];                 } else  {                     $result  += $left_max  - $height [$left ];                 }                 $left ++;             } else  {                 if  ($height [$right ] >= $right_max ) {                     $right_max  = $height [$right ];                 } else  {                     $result  += $right_max  - $height [$right ];                 }                 $right --;             }         }         return  $result ;     } } 
 
结果 执行用时 : 30 ms, 击败 65.31% 使用 PHP 的用户
内存消耗 : 21.50 MB, 击败 79.59% 使用 PHP 的用户
 
Swift 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 class  Solution  {    func  trap (_  height : [Int ]) -> Int  {         let  length =  height.count         guard  length >=  3  else  {             return  0          }         var  left =  0          var  right =  length -  1          var  leftMax =  0          var  rightMax =  0          var  result =  0          while  left <  right {             if  height[left] <  height[right] {                 if  height[left] >=  leftMax {                     leftMax =  height[left]                 } else  {                     result +=  leftMax -  height[left]                 }                 left +=  1              } else  {                 if  height[right] >=  rightMax {                     rightMax =  height[right]                 } else  {                     result +=  rightMax -  height[right]                 }                 right -=  1              }         }         return  result     } } 
 
结果 执行用时 : 26 ms, 击败 100.00% 使用 Swift 的用户
内存消耗 : 15.84 MB, 击败 7.33% 使用 Swift 的用户
 
Kotlin 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 class  Solution  {    fun  trap (height: IntArray )  : Int  {         val  length = height.size         if  (length < 3 ) {             return  0          }         var  left = 0          var  right = length - 1          var  leftMax = 0          var  rightMax = 0          var  result = 0          while  (left < right) {             if  (height[left] < height[right]) {                 if  (height[left] >= leftMax) {                     leftMax = height[left]                 } else  {                     result += leftMax - height[left]                 }                 left++             } else  {                 if  (height[right] >= rightMax) {                     rightMax = height[right]                 } else  {                     result += rightMax - height[right]                 }                 right--             }         }         return  result     } } 
 
结果 执行用时 : 189 ms, 击败 98.29% 使用 Kotlin 的用户
内存消耗 : 39.59 MB, 击败 43.59% 使用 Kotlin 的用户
 
Dart 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 class  Solution   {  int  trap(List <int > height) {     if  (height.length < 3 ) {       return  0 ;     }     int  left = 0 , right = height.length - 1 ;     int  leftMax = 0 , rightMax = 0 ;     int  result = 0 ;     while  (left < right) {       if  (height[left] < height[right]) {         if  (height[left] >= leftMax) {           leftMax = height[left];         } else  {           result += leftMax - height[left];         }         left++;       } else  {         if  (height[right] >= rightMax) {           rightMax = height[right];         } else  {           result += rightMax - height[right];         }         right--;       }     }     return  result;   } } 
 
结果 执行用时 : 284 ms, 击败 88.89% 使用 Dart 的用户
内存消耗 : 148.19 MB, 击败 100.00% 使用 Dart 的用户
 
Go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 func  trap (height []int )   int  {    if  len (height) < 3  {         return  0      }     left, right := 0 , len (height)-1      leftMax, rightMax := 0 , 0      result := 0      for  left < right {         if  height[left] < height[right] {             if  height[left] >= leftMax {                 leftMax = height[left]             } else  {                 result += leftMax - height[left]             }             left++         } else  {             if  height[right] >= rightMax {                 rightMax = height[right]             } else  {                 result += rightMax - height[right]             }             right--         }     }     return  result } 
 
结果 执行用时 : 10 ms, 击败 41.46% 使用 Go 的用户
内存消耗 : 5.18 MB, 击败 99.69% 使用 Go 的用户
 
Ruby 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 def  trap (height )  return  0  if  height.length < 3    left = 0    right = height.length - 1    left_max = 0    right_max = 0    result = 0    while  left < right     if  height[left] < height[right]       if  height[left] >= left_max         left_max = height[left]       else          result += left_max - height[left]       end        left += 1      else        if  height[right] >= right_max         right_max = height[right]       else          result += right_max - height[right]       end        right -= 1      end    end    result end 
 
结果 执行用时 : 61 ms, 击败 % 使用 Ruby 的用户
内存消耗 : 207.34 MB, 击败 % 使用 Ruby 的用户
 
Scala 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 object  Solution   {  def  trap  (height: Array [Int ]): Int  = {     if  (height.length < 3 ) {       0      } else  {       var  left = 0        var  right = height.length - 1        var  leftMax = 0        var  rightMax = 0        var  result = 0        while  (left < right) {         if  (height(left) < height(right)) {           if  (height(left) >= leftMax) {             leftMax = height(left)           } else  {             result += leftMax - height(left)           }           left += 1          } else  {           if  (height(right) >= rightMax) {             rightMax = height(right)           } else  {             result += rightMax - height(right)           }           right -= 1          }       }       result     }   } } 
 
结果 执行用时 : 548 ms, 击败 81.82% 使用 Scala 的用户
内存消耗 : 56.33 MB, 击败 90.91% 使用 Scala 的用户
 
Rust 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 impl  Solution  {    pub  fn  trap (height: Vec <i32 >) ->  i32  {         if  height.len () < 3  {             return  0 ;         }         let  mut  left  = 0 ;         let  mut  right  = height.len () - 1 ;         let  mut  left_max  = 0 ;         let  mut  right_max  = 0 ;         let  mut  result  = 0 ;         while  left < right {             if  height[left] < height[right] {                 if  height[left] >= left_max {                     left_max = height[left];                 } else  {                     result += left_max - height[left];                 }                 left += 1 ;             } else  {                 if  height[right] >= right_max {                     right_max = height[right];                 } else  {                     result += right_max - height[right];                 }                 right -= 1 ;             }         }         result     } } 
 
结果 执行用时 : 0 ms, 击败 100.00% 使用 Rust 的用户
内存消耗 : 2.10 MB, 击败 92.50% 使用 Rust 的用户
 
Racket 暂时未解决
 
结果 执行用时 :  ms, 击败 % 使用 Racket 的用户
内存消耗 :  MB, 击败 % 使用 Racket 的用户
 
Erlang 暂时未解决
 
结果 执行用时 :  ms, 击败 % 使用 Erlang 的用户
内存消耗 :  MB, 击败 % 使用 Erlang 的用户
 
Elixir 暂时未解决
 
结果 执行用时 :  ms, 击败 % 使用 Elixir 的用户
内存消耗 :  MB, 击败 % 使用 Elixir 的用户