[leetcode]42. Trapping Rain Water(Java)
2017-06-23 10:53
656 查看
https://leetcode.com/problems/trapping-rain-water/#/description
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.
For example,
Given
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 Marcosfor contributing this image!
Java code:
package go.jacob.day623;
import org.junit.Test;
public class Demo1 {
@Test
public void testName() throws Exception {
int[] num = { 0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1 };
System.out.println(trap(num));
}
/*
* Runtime: 22 ms
* 参考自leetcode网友:@yuyibestman
*/
public int trap(int[] height) {
if (height == null || height.length < 2)
return 0;
int leftMax = height[0], rightMax = height[height.length - 1], left = 0, right = height.length - 1;
int sum = 0;
while (left < right) {
leftMax = Math.max(height[left], leftMax);
rightMax = Math.max(height[right], rightMax);
if (leftMax < rightMax) {
sum += leftMax - height[left];
left++;
} else {
sum += rightMax - height[right];
right--;
}
}
return sum;
}
/*
* 用总面积减去空白面积,再减去边的面积:分别从两侧从中间搜索,找到最高的边停止 runtime:21ms
*/
public int trap_1(int[] height) {
if (height == null || height.length < 2)
return 0;
int max = height[0];
int sumOfNum = 0;
// 记录空白面积
int additionalArea = 0;
// 找到最高边和所有边的和
for (int i = 0; i < height.length; i++) {
if (max < height[i])
max = height[i];
sumOfNum += height[i];
}
int tmpLarge = height[0];
int otherEdge = 0;
// 从左边开始搜索
for (int i = 0; i < height.length; i++) {
if (tmpLarge < height[i]) {
additionalArea += (i - otherEdge) * (max - tmpLarge);
otherEdge = i;
tmpLarge = height[i];
}
// 找到最高边,停止搜索
if (height[i] == max)
break;
}
tmpLarge = height[height.length - 1];
otherEdge = height.length - 1;
// 从右边开始搜索
for (int i = height.length - 1; i >= 0; i--) {
if (tmpLarge < height[i]) {
additionalArea += (otherEdge - i) * (max - tmpLarge);
tmpLarge = height[i];
otherEdge = i;
}
// 找到最高边,停止搜索
if (height[i] == max)
break;
}
int area = height.length * max - sumOfNum - additionalArea;
return area;
}
}
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.
For example,
Given
[0,1,0,2,1,0,1,3,2,1,2,1], return
6.
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 Marcosfor contributing this image!
Java code:
package go.jacob.day623;
import org.junit.Test;
public class Demo1 {
@Test
public void testName() throws Exception {
int[] num = { 0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1 };
System.out.println(trap(num));
}
/*
* Runtime: 22 ms
* 参考自leetcode网友:@yuyibestman
*/
public int trap(int[] height) {
if (height == null || height.length < 2)
return 0;
int leftMax = height[0], rightMax = height[height.length - 1], left = 0, right = height.length - 1;
int sum = 0;
while (left < right) {
leftMax = Math.max(height[left], leftMax);
rightMax = Math.max(height[right], rightMax);
if (leftMax < rightMax) {
sum += leftMax - height[left];
left++;
} else {
sum += rightMax - height[right];
right--;
}
}
return sum;
}
/*
* 用总面积减去空白面积,再减去边的面积:分别从两侧从中间搜索,找到最高的边停止 runtime:21ms
*/
public int trap_1(int[] height) {
if (height == null || height.length < 2)
return 0;
int max = height[0];
int sumOfNum = 0;
// 记录空白面积
int additionalArea = 0;
// 找到最高边和所有边的和
for (int i = 0; i < height.length; i++) {
if (max < height[i])
max = height[i];
sumOfNum += height[i];
}
int tmpLarge = height[0];
int otherEdge = 0;
// 从左边开始搜索
for (int i = 0; i < height.length; i++) {
if (tmpLarge < height[i]) {
additionalArea += (i - otherEdge) * (max - tmpLarge);
otherEdge = i;
tmpLarge = height[i];
}
// 找到最高边,停止搜索
if (height[i] == max)
break;
}
tmpLarge = height[height.length - 1];
otherEdge = height.length - 1;
// 从右边开始搜索
for (int i = height.length - 1; i >= 0; i--) {
if (tmpLarge < height[i]) {
additionalArea += (otherEdge - i) * (max - tmpLarge);
tmpLarge = height[i];
otherEdge = i;
}
// 找到最高边,停止搜索
if (height[i] == max)
break;
}
int area = height.length * max - sumOfNum - additionalArea;
return area;
}
}
相关文章推荐
- LeetCode 42. Trapping Rain Water(java)
- LeetCode- 42. Trapping Rain Water (JAVA)收集雨水
- Java for LeetCode 042 Trapping Rain Water
- [LeetCode] 42. Trapping Rain Water 解题思路
- [Leetcode] 42. Trapping Rain Water 解题报告
- LeetCode: 42. Trapping Rain Water
- [LeetCode][Java] Trapping Rain Water
- LeetCode------42. Trapping Rain Water(捕获雨水量)
- Leetcode 42. Trapping Rain Water (Hard) (cpp)
- LeetCode 第四十二题(Trapping Rain Water) Java
- [LeetCode]42. Trapping Rain Water
- 【LeetCode】42. Trapping Rain Water
- LeetCode 42. Trapping Rain Water(装雨水)
- [LeetCode]42. Trapping Rain Water
- Leetcode 42. Trapping Rain Water
- Leetcode 42. Trapping Rain Water
- 42. Trapping Rain Water leetcode Python 2016 new season
- [leetcode] 42. Trapping Rain Water 解题报告
- LeetCode 42. Trapping Rain Water
- leetcode题解-42. Trapping Rain Water