LeetCode 42:接雨水

a 夏天 提交于 2019-12-21 23:42:51

题目描述

给定 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中 归属于类型题目。
同许多在算法道路上不断前行的人一样,不断练习,修炼自己!
如有博客中存在的疑问或者建议,可以在下方留言一起交流,感谢各位!

觉得本博客有用的客官,可以给个赞鼓励下! 嘿嘿

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!