题目: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.

例如给出上图中的黑色部分(数组表示),让你求出蓝色部分。

这也是个神题。。。当然对小白我来说。

想了半天,是不是遍历数组呢,然后依次计算当前bar构成的container大小。问题在于,这个方法要考虑的边界条件太多了。写了一个很复杂的算法,还用到了stack来记录碎片的蓝色部分,结果最后还是miss很多情况。

后来想了一个复杂度比较高的但是代码看来了比较简单的算法。觉得简直要被BS屎了。但是还是记录下来以村托牛人的牛。

想的方法我取名叫俄罗斯方块法,为啥,你马上就晓得鸟。

把上面的图图,instead of看成一个个柱子,我看成一排排的方块。

然后,对每一行,我数数有多少蓝色的方块,累加起来,不就是总共的蓝色部分了么。

这个复杂度有点高,取决与最大的元素的值*O(n)。

解法一:

 public static int trap(int[] A){
int i = 0;
int j = A.length - 1;
int sumArea = 0;
while(i + 1 < j){
//首先找到两边都不是0的位置
while(A[i] <= 0 && i < j)i++;
while(A[j] <= 0 && i < j)j--;
//然后数数当前行有多少蓝色方块,也是就0的个数啦。
//同时记录最小值
int min = Integer.MAX_VALUE;
for(int k = i; k < j;k++){
if(A[k] == 0) sumArea += 1;
if(A[k] < min) min = A[k];
}
//为记录下一行做准备,消除俄罗斯方块。。。。
int step = Math.max(min, 1);
for(int k = i; k <= j; k++){
if(A[k] > 0)A[k]-= step;
}
}
return sumArea;
}

然后大集合就可耻地潮湿了。

leetcode的牛人是怎么做的呢?人家不仅有O(n)的解法,而且constant space。膜拜。

首先,找到最高的一个柱子,例如例子中的3。

然后遍历左半边。从i=0开始靠近mid,遍历过程中维护一个curHeight,表示这当前遇到的最大的height值;如果当前的bar的height小于最大值,那么当前的bar能贡献的water就是height - curMaxHeight。否则的话,更新curMaxHeight。

为了更好理解这个算法,我们来track下这个过程:

     

         

最后遍历右半边。过程是一模一样的,只不过i从最右边靠近Mid。

解法二

代码如下:

 public static int trap2(int[] A){
if(A.length <= 1) return 0;
int curMaxHeight = 0;
int water = 0;
int mid = 0;
for(int i = 0; i < A.length;i++){
if(A[i] > A[mid]) mid = i;
} for(int i = 0; i < mid; i++){
if(A[i] < curMaxHeight){
water += curMaxHeight - A[i];
}else curMaxHeight = A[i];
} curMaxHeight = 0;
for(int i = A.length - 1; i > mid; i--){
if(A[i] < curMaxHeight){
water += curMaxHeight -A[i];
}else curMaxHeight = A[i];
}
return water;
}

其实,本质上来说,第一步保障了左右两边的水总是能“放进去”,因为大板子在中间档着嘛。

Faint,我写到这里,想到这个代码其实也是蛮简单的,为啥我就没想到呢!唉。。。

总结下:

复杂的代码是错误的代码。没有例外。

LeetCode 笔记系列12 Trapping Rain Water [复杂的代码是错误的代码]的更多相关文章

  1. leetcode 第41题 Trapping Rain Water

    题目: Given n non-negative integers representing an elevation map where the width of each bar is 1, co ...

  2. LeetCode(42)Trapping Rain Water

    题目 Given n non-negative integers representing an elevation map where the width of each bar is 1, com ...

  3. LeetCode: Trapping Rain Water 解题报告

    https://oj.leetcode.com/problems/trapping-rain-water/ Trapping Rain WaterGiven n non-negative intege ...

  4. [LeetCode] Trapping Rain Water II 收集雨水之二

    Given an m x n matrix of positive integers representing the height of each unit cell in a 2D elevati ...

  5. [LeetCode] Trapping Rain Water 收集雨水

    Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...

  6. [Leetcode][Python]42: Trapping Rain Water

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 42: Trapping Rain Waterhttps://oj.leetc ...

  7. leetcode#42 Trapping rain water的五种解法详解

    leetcode#42 Trapping rain water 这道题十分有意思,可以用很多方法做出来,每种方法的思想都值得让人细细体会. 42. Trapping Rain WaterGiven n ...

  8. [array] leetcode - 42. Trapping Rain Water - Hard

    leetcode - 42. Trapping Rain Water - Hard descrition Given n non-negative integers representing an e ...

  9. [LeetCode] 接雨水,题 Trapping Rain Water

    这题放上来是因为自己第一回见到这种题,觉得它好玩儿 =) Trapping Rain Water Given n non-negative integers representing an eleva ...

随机推荐

  1. django 常用命令 详解

    check     compilemessages     createcachetable     dbshell     diffsettings     dumpdata     flush   ...

  2. Linux关机和重启命令总结

    一.shutdown 命令 作用:关闭或重启系统 使用权限:超级管理员使用 常用选项 1. -r 关机后立即重启 2. -h关机后不重启 3. -f快速关机,重启时跳过fsck(file system ...

  3. JavaScript 中 this 的用法

    在 JavaScript 中,this 是动态绑定,或称为运行期绑定的.一般而言,在Javascript中,this 指向函数执行时的当前对象. 由于其运行期绑定的特性,JavaScript 中的 t ...

  4. Lattice 开发工具Diamond 相关版本下载地址

    百度网盘: https://wenku.baidu.com/view/21b98975192e45361066f5f3.html 官网下载: http://www.latticesemi.com/Su ...

  5. [svc]执行sudo时报错:effective uid is not 0

    http://jingyan.baidu.com/article/c45ad29cd83d4b051753e232.html 今天将 / 授权给了一个普通用户 导致一些问题. 启事: 操作前一定要先在 ...

  6. 【Android】13.2 使用自定义的CursorAdapter访问SQLite数据库

    分类:C#.Android.VS2015: 创建日期:2016-02-26 一.简介 SQliteDemo1的例子演示了SimpleCursorAdapter的用法,本节我们将使用用途更广的自定义的游 ...

  7. 中兴ZXV10 B860AV1.1 全TTL操作完美破解

    本文转自:http://www.znds.com/tv-496624-1-1.html 1)前期准备工作 1.1 拆开盒子,TTL接线,这个论坛里有好多其它帖子,就不再详细描述. 1.2 复制需要安装 ...

  8. dp背包之01背包poj2184

    http://poj.org/problem?id=2184 题意:给定两个属性,求这两个属性的和的最大值......... 思路:将第一个属性往后平移1000个单位,然后推导其动态转移方程,若是dp ...

  9. jquery ajax api

    执行一个异步的HTTP(Ajax)的请求. version added: 1.5jQuery.ajax( url, [ settings ] ) url一个用来包含发送请求的URL字符串. setti ...

  10. strcmp在CTF中的案例

    当strcmp比较出错的时候就会为null.null即为0故输出flag. strcmp(arr,str); ?test[]=1 <?php define('FLAG', 'pwnhub{THI ...