Skip to content

Commit

Permalink
feat(leecode): 42.接雨水
Browse files Browse the repository at this point in the history
  • Loading branch information
z979054461 committed Mar 20, 2024
1 parent cc0e53c commit bd73ea0
Show file tree
Hide file tree
Showing 3 changed files with 143 additions and 0 deletions.
62 changes: 62 additions & 0 deletions docs/10.LeeCode/42.接雨水.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
---
title: 42.接雨水
date: 2024-03-20
lang: 'zh-CN'
sidebar: 'auto'
categories:
- LeeCode
tags:
location: HangZhou
---

# Heading

[[toc]]

[42.接雨水](https://leetcode.cn/problems/trapping-rain-water/description/)

Tags: algorithms amazon apple bloomberg google twitter zenefits array two-pointers stack

Langs: c cpp csharp dart elixir erlang golang java javascript kotlin php python python3 racket ruby rust scala swift typescript

- algorithms
- Hard (63.28%)
- Likes: 5071
- Dislikes: -
- Total Accepted: 901.1K
- Total Submissions: 1.4M
- Testcase Example: '[0,1,0,2,1,0,1,3,2,1,2,1]'

<p>给定&nbsp;<code>n</code> 个非负整数表示每个宽度为 <code>1</code> 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。</p>

<p>&nbsp;</p>

<p><strong>示例 1:</strong></p>

<p><img src="https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/10/22/rainwatertrap.png" style="height: 161px; width: 412px;" /></p>

<pre>
<strong>输入:</strong>height = [0,1,0,2,1,0,1,3,2,1,2,1]
<strong>输出:</strong>6
<strong>解释:</strong>上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
</pre>

<p><strong>示例 2:</strong></p>

<pre>
<strong>输入:</strong>height = [4,2,0,3,2,5]
<strong>输出:</strong>9
</pre>

<p>&nbsp;</p>

<p><strong>提示:</strong></p>

<ul>
<li><code>n == height.length</code></li>
<li><code>1 &lt;= n &lt;= 2 * 10<sup>4</sup></code></li>
<li><code>0 &lt;= height[i] &lt;= 10<sup>5</sup></code></li>
</ul>

<<< @/src/LeeCode/42.接雨水.js
<<< @/src/LeeCode/42.接雨水1.js
50 changes: 50 additions & 0 deletions src/LeeCode/42.接雨水.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/*
* @lc app=leetcode.cn id=42 lang=javascript
*
* [42] 接雨水
* 乱七八糟解出来的……,固定左指针寻找下一个右侧边际
*/

// @lc code=start
/**
* @param {number[]} height
* @return {number}
*/
var trap = function (height) {
let i = 0
let j = 0
let sum = 0

while (i < height.length) {
if (height[i] > 0) {
j = i + 1
let tmpHeight = 0
let tmpMax = 0
let rightIndex = 0
while (j < height.length && height[j] < height[i]) {
if (height[j] > tmpMax) {
tmpMax = height[j]
rightIndex = j
}
tmpHeight += height[j++]
}
if (j < height.length) {
rightIndex = j
} else if (rightIndex > 0) {
let k = rightIndex
while (k < j) {
tmpHeight -= height[k++]
}
}

if (rightIndex > 0) {
sum += (rightIndex - i - 1) * Math.min(height[i], height[rightIndex]) - tmpHeight
i = rightIndex
continue
}
}
i++
}
return sum
}
// @lc code=end
31 changes: 31 additions & 0 deletions src/LeeCode/42.接雨水1.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* @lc app=leetcode.cn id=42 lang=javascript
*
* [42] 接雨水
* 双指针
*/

// @lc code=start
/**
* @param {number[]} height
* @return {number}
*/
var trap = function (height) {
let left = 0
let right = height.length - 1
let leftMax = 0
let rightMax = 0
let sum = 0
while (left < right) {
leftMax = Math.max(leftMax, height[left])
rightMax = Math.max(rightMax, height[right])

if (height[left] < height[right]) {
sum += leftMax - height[left++]
} else {
sum += rightMax - height[right--]
}
}
return sum
}
// @lc code=end

0 comments on commit bd73ea0

Please sign in to comment.