42. Trapping Rain Water
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
思路:
题目意思是给定一个数组,数值代表了高度,求解可以装多少水,仔细分析可以发现,对于任意一位能存储多少水是取决于左右当前元素左右两边最大值的最小值来减去当前元素就是当前节点能装多少水,公式就类似:
trap[i] = min(maxHight(0,i-1), maxHight(i 1, n)) - height[i]
,trap[i]
是当前位置可以装多少水,maxHight就分别是左右两边的最大高度,采用首尾指针,通过标记左右最大高度来计算是否可以。
代码:
java:
代码语言:javascript复制class Solution {
public int trap(int[] height) {
if (height == null || height.length <= 1) return 0;
int res = 0;
int leftMax = 0;
int rightMax = 0;
for (int left = 0, right = height.length-1; left < right;) {
if (height[left] < height[right]) {
leftMax = Math.max(leftMax, height[left]);
res = leftMax - height[left ];
} else {
rightMax = Math.max(rightMax, height[right]);
res = rightMax - height[right--];
}
}
return res;
}
}
go:
代码语言:javascript复制func trap(height []int) int {
var res int
if height == nil || len(height) == 0 {
return res
}
leftMax := 0
rightMax := 0
left := 0
right := len(height) - 1
for left != right {
if height[left] < height[right] {
leftMax = max(leftMax, height[left])
res = leftMax - height[left]
left
} else {
rightMax = max(rightMax, height[right])
res = rightMax - height[right]
right--
}
}
return res
}
func max(i, j int) int {
if i > j {
return i
}
return j
}