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.
The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!
Example:
Input: [0,1,0,2,1,0,1,3,2,1,2,1]
Output: 6
思路:先找出每个小坑,然后把小坑合并,直到不能合并为止
这道题目以前打比赛的时候做过,但还是花了很长的时间,有很多的坑,最重要的是要想到,小坑可以合并成大坑
/**
* @param {number[]} height
* @return {number}
*/
var trap = function(height) {
let len = height.length
let ans = 0
let left = 0
let right, index = 1
let flag1 = false
let flag2 = false
let pointArr = []
let set = new Set()
while(index + 1 < len) {
flag1 = false
flag2 = false
while(index < len && height[index] >= height[left]) {
left = index
index ++
}
while(index < len && height[index] >= height[index + 1]) {
index ++
}
if(index < len && height[index] <= height[left]) flag1 = true
while(index < len && height[index] <= height[index + 1]) {
index ++
flag2 = true
}
if(flag1 && flag2) {
right = index
pointArr.push([left, right])
left = right
}
}
let pointLen
let ans2
while(true){
ans2 = []
pointLen = pointArr.length
for(let i = 0; i < pointLen; i ++) {
let left = pointArr[i][0]
let right = pointArr[i][1]
if(i + 1 < pointLen) {
let left2 = pointArr[i + 1][0]
let right2 = pointArr[i + 1][1]
while(right === left2 && height[right] <= height[right2] && height[right] <= height[left]) {
right = right2
i ++
if(i + 1 < pointLen) {
left2 = pointArr[i + 1][0]
right2 = pointArr[i + 1][1]
}else break
}
}
ans2.push([left, right])
}
if(ans2.length != pointLen) {
pointArr = ans2
ans2 = []
}else break
}
for(let i = 0; i < ans2.length; i ++) {
let left = ans2[i][0]
let right = ans2[i][1]
let maxHeight = Math.min(height[left], height[right])
for(let j = left + 1; j < right; j ++) {
if(maxHeight > height[j])
ans += maxHeight - height[j]
}
}
return ans
};