标签:
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 Marcos for contributing this image!
Subscribe to see which companies asked this question
思路一:
观察水的分布可发现,水位的分布情况显现梯形的,即先上升后下降。
因此可以先求出最高点,然后左右两边往中间遍历求水的容量。
c++ code:
class Solution { public: int trap(vector<int>& height) { int size = height.size(); int maxIndex = 0; for(int i=0;i<size;i++) { if(height[i] > height[maxIndex]) maxIndex = i; } int area = 0; int maxLeft = 0; for(int i=0;i<maxIndex;i++) { if(height[i] > maxLeft) maxLeft = height[i]; else area += maxLeft - height[i]; } int maxRight = 0; for(int i=size-1;i>=maxIndex;i--) { if(height[i] > maxRight) maxRight = height[i]; else area += maxRight - height[i]; } return area; } };
思路二:
直接用两个指针分别往中间移动,每次维持次高的水位secHeight。
java code:
public class Solution { public int trap(int[] height) { int len = height.length; int left = 0, right = len - 1; int secHeight = 0; int area = 0; while(left <right) { if(height[left] < height[right]) { secHeight = Math.max(secHeight, height[left]); area += secHeight - height[left]; left++; } else { secHeight = Math.max(secHeight, height[right]); area += secHeight - height[right]; right--; } } return area; } }
标签:
原文地址:http://blog.csdn.net/itismelzp/article/details/51636695