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;
        }
    }

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

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

  • 相关阅读:
    一个简单粗暴的爬虫
    Linux 目录结构
    python 部署 Restful web
    JVM 运行时数据区总结 栈 堆 堆大小配置总结
    成都法律援助申请流程
    JavaEE error整理(不断更新)
    ehcache.xml 属性大全
    SpringMVC 构建Restful风格 及问题处理
    Http Content-Type
    Redis 教程 Java工程师学习知识点
  • 原文地址:https://www.cnblogs.com/doyi111/p/12675985.html
Copyright © 2011-2022 走看看