题目描述
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
解题思路
借助栈的结构来解决,设定指针初始位置为0,在越界的前提下,依次向后移动,在初始及栈顶元素的高度大于当前指针所指高度时,压栈操作,指针后移。当栈不为空且,栈顶元素高度小于当前指针的高度时,将栈顶高度的值存入中间变量,并将栈顶弹出。此时如果栈为空的话,说明没有另外一面墙和其配对,则break继续压栈指针后移。否则,记录两面墙之间的距离,用两面墙中的最小值与距离相乘,即为面积。,重复上述操作,记录累计的面积和!!!!!
代码实现
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
import java.util.Stack;
public class waterContaining {
//接雨水
public int trap(int[] height){//acc: 8ms 30%
int sum=0;//雨水总量
Stack<Integer> stack=new Stack<>();
int current=0; //指针初始位置
while (current<height.length){//指针不越界
while (!stack.empty()&&height[current]>height[stack.peek()]){
//栈不为空且当前指针所指墙的高度大于栈顶墙的高度
int h=height[stack.peek()];//配对的两面墙之间的底部高度
stack.pop();
if (stack.empty()){//证明此时只有单面墙,没有另外一面墙何其配对
break;
}
int distance=current-stack.peek()-1;//两墙之间的距离
int min=Math.min(height[stack.peek()],height[current]);//取两墙之间的最小值
sum=sum+distance*(min-h);
}
stack.push(current);
current++;
}
return sum;
}
public int trap_2(int[] height){// acc:1ms 100%
int left = 0, right =height.length-1;
int ans = 0;
int leftmax = 0, rightmax = 0;
while (left < right) {
if (height[left] < height[right]){
if (height[left] >= leftmax) {
leftmax = height[left];
}else {
ans += (leftmax - height[left]);
}
++left;
}
else {
if (height[right] >= rightmax){
rightmax = height[right];
}else {
ans += (rightmax - height[right]);
}
--right;
}
}
return ans;
}
public static void main(String[] args) {
waterContaining test=new waterContaining();
int[] height={0,2,0,3,0,1,0,3};
int sum=test.trap_2(height);
System.out.println(sum);
}
}
总结
本题来源于Leetcode中 归属于栈类型题目。
同许多在算法道路上不断前行的人一样,不断练习,修炼自己!
如有博客中存在的疑问或者建议,可以在下方留言一起交流,感谢各位!
觉得本博客有用的客官,可以给个赞鼓励下! 嘿嘿
来源:CSDN
作者:香农派我最爱
链接:https://blog.csdn.net/weixin_43161461/article/details/103648314