Problem:
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.

Solution1是自己首先想到的一个版本,遇到下降的块压栈,遇到上升的块出栈,计算矩形面积。时间复杂度为O(n),空间复杂度为O(n)。
Solution2参考了别人的解决方法。想法就是先计算总面积,再减去实块所占的面积。时间复杂度O(n),空间复杂度O(1)。
Solution1:
public class Solution {
public int trap(int[] A) {
if(A==null||A.length==0)
return 0;
Stack<Integer> st = new Stack<>();
int water = 0;
int pre = 0;
for(int i=0;i<A.length;i++)
{
if(!st.empty()&&(A[i]>A[st.peek()]||i>st.peek()+1))
{
int j=st.peek();
while(!st.empty()&&A[i]>=A[st.peek()])
{
j = st.pop();
water += (i-j-1)*(A[j]-pre);
pre = A[j];
}
if(!st.empty())
{
water += (i-st.peek()-1)*(A[i]-pre);
pre = A[i];
}
}
else
pre = 0;
st.push(i);
}
return water;
}
if(A==null||A.length==0)
return 0;
Stack<Integer> st = new Stack<>();
int water = 0;
int pre = 0;
for(int i=0;i<A.length;i++)
{
if(!st.empty()&&(A[i]>A[st.peek()]||i>st.peek()+1))
{
int j=st.peek();
while(!st.empty()&&A[i]>=A[st.peek()])
{
j = st.pop();
water += (i-j-1)*(A[j]-pre);
pre = A[j];
}
if(!st.empty())
{
water += (i-st.peek()-1)*(A[i]-pre);
pre = A[i];
}
}
else
pre = 0;
st.push(i);
}
return water;
}
}
Solution2:
public class Solution {
public int trap(int[] A){
if(A==null||A.length<=1)
return 0;
int blocks = 0,all = 0,b = 0,e = A.length-1,height = 0;
while(b<e)
{
while(b<e&&A[b]<=height)blocks += A[b++];
while(b<e&&A[e]<=height)blocks += A[e--];
all += (Math.min(A[b], A[e])-height)*(e-b+1);
height = Math.min(A[b], A[e]);
}
return all - blocks - A[b];
}
}
public int trap(int[] A){
if(A==null||A.length<=1)
return 0;
int blocks = 0,all = 0,b = 0,e = A.length-1,height = 0;
while(b<e)
{
while(b<e&&A[b]<=height)blocks += A[b++];
while(b<e&&A[e]<=height)blocks += A[e--];
all += (Math.min(A[b], A[e])-height)*(e-b+1);
height = Math.min(A[b], A[e]);
}
return all - blocks - A[b];
}
}
本文介绍两种计算雨后地面积水的方法:一种通过栈结构处理高度变化实现,另一种通过双指针技术逐步逼近最大高度。
259

被折叠的 条评论
为什么被折叠?



