mirror of
https://github.com/TheAlgorithms/JavaScript.git
synced 2025-07-05 00:01:37 +08:00
complete trapping rain water
This commit is contained in:
63
Dynamic-Programming/TrappingRainWater.js
Normal file
63
Dynamic-Programming/TrappingRainWater.js
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/**
|
||||||
|
* @param {number[]} height
|
||||||
|
* @return {number}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* 42. Trapping Rain Water
|
||||||
|
https://leetcode.com/problems/trapping-rain-water/
|
||||||
|
|
||||||
|
Helpful animation of this prompt: https://youtu.be/HmBbcDiJapY?t=51
|
||||||
|
|
||||||
|
Given n non-negative integers representing an elevation map where
|
||||||
|
the width of each bar is 1, compute how much water it is able to trap
|
||||||
|
after raining.
|
||||||
|
|
||||||
|
VIEW ELEVATION MAP ON LEETCODE
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
Input: [0,1,0,2,1,0,1,3,2,1,2,1]
|
||||||
|
Output: 6
|
||||||
|
|
||||||
|
Plan:
|
||||||
|
iterate through and find left maxes
|
||||||
|
iterate through and find right maxes
|
||||||
|
create minheight and assign it to the min(leftmax, rightmax)
|
||||||
|
if current height(element) < minheight
|
||||||
|
push minheight - height into water array
|
||||||
|
else
|
||||||
|
push 0 onto water array
|
||||||
|
|
||||||
|
sum up water array and return
|
||||||
|
|
||||||
|
left maxes = [0,0,1,1,2,2,2,2,3,3,3,3]
|
||||||
|
right maxes = [3,3,3,3,3,3,3,2,2,2,1,0]
|
||||||
|
water contained = [0,0,1,0,1,2,1,0,0,1,0,0] -> sum = 6
|
||||||
|
*/
|
||||||
|
|
||||||
|
function trap (heights) {
|
||||||
|
const maxes = new Array(heights.length).fill(0)
|
||||||
|
|
||||||
|
let leftMax = 0
|
||||||
|
for (let i = 0; i < heights.length; i++) {
|
||||||
|
const height = heights[i]
|
||||||
|
maxes[i] = leftMax
|
||||||
|
leftMax = Math.max(leftMax, height)
|
||||||
|
}
|
||||||
|
|
||||||
|
let rightMax = 0
|
||||||
|
for (let i = heights.length - 1; i >= 0; i -= 1) {
|
||||||
|
const height = heights[i]
|
||||||
|
const minHeight = Math.min(rightMax, maxes[i])
|
||||||
|
|
||||||
|
if (height < minHeight) {
|
||||||
|
maxes[i] = minHeight - height
|
||||||
|
} else {
|
||||||
|
maxes[i] = 0
|
||||||
|
}
|
||||||
|
rightMax = Math.max(rightMax, height)
|
||||||
|
}
|
||||||
|
return maxes.reduce((a, b) => a + b, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(trap([0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1])) // -> 6
|
1982
package-lock.json
generated
Normal file
1982
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
@ -12,7 +12,7 @@
|
|||||||
"node-fetch": "2.6.1"
|
"node-fetch": "2.6.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"standard": "^14.3.4",
|
"doctest": "^0.17.1",
|
||||||
"doctest": "^0.17.1"
|
"standard": "^14.3.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user