单调栈算法leetcode.42

 public int trap(int[] height) {
        int n=height.length;
        if(n==1)
            return 0;
        //装满雨水后,整体变为一个类似阶梯的图形,求出阶梯体积,减去柱子体积即为答案
        int max=0;//最大高度
        int sum=0;//所有柱子体积
        for (int i = 0; i < n; i++) {
            max=Math.max(max,height[i]);
            sum+=height[i];
        }
        int[][] border=new int[max+1][2];//不同高度柱子的左右边界
        //初始化
        for (int i = 0; i <= max; i++) {
            Arrays.fill(border[i],-1);
        }
        //从1开始寻找高度为h的柱子边界
        int l=0;
        int r=n-1;
        int h=1;
       while (l<=r){
           if(height[l]h)//遇到高于h的柱子,暂时停留
               border[h][0]=l;

           if(height[r]h)
               border[h][1]=r;
           if(border[h][0]!=-1&&border[h][1]!=-1)//确定边界后,h+1
               h++;
           if(h>max)
               break;
       }
       int v=0;//整体体积
        for (int i = 1; i <=max ; i++) {
           v+=border[i][1]-border[i][0]+1;
        }
       return v-sum;
    }

单调栈做法

 public int trap(int[] height) {
        int n=height.length;
       Deque stk=new ArrayDeque<>();//单调递减栈,存储下标
       int ans=0;
       //遍历每个柱子
        for (int i = 0; i < n; i++) {
            //当栈非空,并且当前柱子高于栈顶柱子,一定能接水
            while (!stk.isEmpty()&&height[i]>height[stk.getLast()]){
                int last=stk.pollLast();//栈顶为最低点,栈顶出栈
                //判断栈顶左边是否有柱子
                if(!stk.isEmpty()){
                    int left=stk.getLast();//左边柱子高度
                    ans+=(Math.min(height[left],height[i])-height[last])*(i-left-1);
                }
            }
            stk.offer(i);//当前柱子低于或等于栈顶时,无法接水,入栈
        }
        return ans;
    }

你可能感兴趣的:(算法总结,蓝桥杯,算法,java,单调栈,leetcode)