zoukankan      html  css  js  c++  java
  • [LeetCode] 42. 接雨水

    脑壳铁了,只想到用栈,没什么思路我的妈

    题解中用栈的思路是:

    class Solution {
        public int trap(int[] height) {
            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;
        }
    }

    慢的要死哈

     方法二:单独求每一列的值,更慢了。。。。

    class Solution {
        public int trap(int[] height) {
            int sum=0;
            for(int i=1;i<height.length;i++){
                int max_left=0;
                for(int j=i-1;j>=0;j--){
                    if(height[j]>max_left){
                        max_left=height[j];
                    }
                }
                int max_right=0;
                for (int j = i + 1; j < height.length; j++) {
                    if (height[j] > max_right) {
                        max_right = height[j];
                    }
                }
                int min=Math.min(max_left,max_right);
                if(min>height[i]){
                    sum=sum+(min-height[i]);
                }
            }
            return sum;
        }
    }

     方法三:

    动态规划,用一个数组来记录之前得到的值。

    class Solution {
        public int trap(int[] height) {
            int sum = 0;
            int[] max_left = new int[height.length];
            int[] max_right = new int[height.length];
        
            for (int i = 1; i < height.length - 1; i++) {
                max_left[i] = Math.max(max_left[i - 1], height[i - 1]);
            }
            for (int i = height.length - 2; i >= 0; i--) {
                max_right[i] = Math.max(max_right[i + 1], height[i + 1]);
            }
            for (int i = 1; i < height.length - 1; i++) {
                int min = Math.min(max_left[i], max_right[i]);
                if (min > height[i]) {
                    sum = sum + (min - height[i]);
            }
        }
        return sum;
        }
    }

    天 这个添加了一个备用数组就快了这么多,牛

     还有一个优化动态规划的,待定!!!!

  • 相关阅读:
    Non Clustered Confluence: Database is being updated by another Confluence instance
    晦涩时光 浮光掠影
    迷雾重重 星光闪耀
    navicat 查询窗口快捷键
    sublime使用技巧记录
    mvn 手动打包并放置到本地仓库下
    git bash 风格调整(显示中文)
    windows控制台(console)乱码
    java调用第三方命令,process.waitfor()挂起(你不知道的坑)
    shell问题-报错即退出
  • 原文地址:https://www.cnblogs.com/doyi111/p/12675985.html
Copyright © 2011-2022 走看看