zoukankan      html  css  js  c++  java
  • Leetcode: Trapping Rain Water

    Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.
    
    For example, 
    Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.
    
    
    The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!

    这道题做的比较艰辛,一开始自己想的是一个用stack的解法,感觉过于繁琐(出栈,入栈,计算容积),但未尝不是一个好的尝试,这个方法还是有点小问题,过后会好好想清楚。看了网上提示完成了最终的方法,这个方法两次遍历数组,第一次遍历找每个元素右边最大的元素,第二次遍历寻找每个元素左边最大的元素,同时计算该index可以存放的水容积: min{lefthighest, righthighest}-A[i]

    用两个array

     1 public class Solution {
     2     public int trap(int[] A) {
     3         int[] left = new int[A.length];
     4         int[] right = new int[A.length];
     5         int sum = 0;
     6         for (int i=0; i<A.length; i++) {
     7             if (i == 0) left[i] = 0;
     8             else {
     9                 left[i] = Math.max(left[i-1], A[i-1]);
    10             }
    11         }
    12         for (int i=A.length-1; i>=0; i--) {
    13             if (i == A.length - 1) right[i] = 0;
    14             else {
    15                 right[i] = Math.max(right[i+1], A[i+1]);
    16             }
    17             if (Math.min(left[i], right[i]) > A[i]) {
    18                 sum += Math.min(left[i], right[i]) - A[i];
    19             }
    20         }
    21         return sum;
    22     }
    23 }

    用一个array和一个变量

     1 public class Solution {
     2     public int trap(int[] A) {
     3         int[] left = new int[A.length];
     4         int right = 0;
     5         int sum = 0;
     6         for (int i=0; i<A.length; i++) {
     7             if (i == 0) left[i] = 0;
     8             else {
     9                 left[i] = Math.max(left[i-1], A[i-1]);
    10             }
    11         }
    12         for (int i=A.length-1; i>=0; i--) {
    13             if (i == A.length - 1) right = 0;
    14             else {
    15                 right = Math.max(right, A[i+1]);
    16             }
    17             if (Math.min(left[i], right) > A[i]) {
    18                 sum += Math.min(left[i], right) - A[i];
    19             }
    20         }
    21         return sum;
    22     }
    23 }
  • 相关阅读:
    网络七层协议之部分协议详解
    C/C++书籍分享(百度网盘版)
    poi导出excel实例
    java map去除空值和null,等一些好用的工具类
    mysql查询出来的sum结果后边有.0如何去除
    java form 表单提交多条数据到后台!
    使用jsp链接jdbc数据库并将数据显示出来
    对接短信平台wsdl获取代码方式!并使用
    Flutter! 记录一下艰难的Flutter+vscode+真机,第一次调试成功
    微信公众号开发-微信公众号网页H5静默授权!!!
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/3726903.html
Copyright © 2011-2022 走看看