题目:

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!

题目意思应该很好理解,就是给定数组后,如图,能存放多少单位的水。网上大多数人的方法都是累加每柱能容纳的水。例如。我的做法是,累加当前到之后第一个不小于自己的柱子能存的水。定义一个start,每次计算完一块水域之后,start跳到这块水域的右边柱子往后找新的水域。直到最后。应该是O(n)的。现在就出现问题了,如果出现4 2 3 的例子,如果按照刚才的思路,4的时候,后面没有大于等于4的数,那start就++的话,答案最终是零了。解决的办法是,如果之后没有发现比大于等于自己的柱子,那么就将自己减一,再判断,知道自己为零,或者是找到不小于自己的柱子为止。

oj上证明我的方法比别人快5倍。

class Solution {
public:
int trap(int A[], int n)
{
int sum = 0, start = -1;
while(++start < n && A[start] == 0);// 找到第一个非零为start
while(start < n)
{
int next = start, minus = 0;
while(++next < n && A[next] < A[start])
{
minus += A[next];
}
if (next == n) // 说明之后没有比当前大或者相等的数,所以要将A[start]值减一后再判断,直到有找到不小于当前的数或者已经减到0了
{
A[start] -= 1;
if (A[start] > 0)//只要大于零就要再判断之后有没有不小于当前的数
continue;
}
sum += (next - start - 1) * A[start] - minus;
start = next;
}
return sum;
}
};

发现oj上如果把注释去掉,居然更快。。。

2015/04/03: 只扫描一遍,left从左往右,right从右往左,每次比较小的往里走,走到比自己大的位置,过程当中记录可以盛的水。(阿里2015校招实习生笔试题)

class Solution {
public:
int trap(int A[], int n) {
int left = , right = n - , water = ;
while(left < right){
if (A[left] < A[right]){
int i = left + ;
while(i < right && A[i] < A[left]){
water += A[left] - A[i++];
}
left = i;
}
else{
int i = right - ;
while(i > left && A[i] < A[right]){
water += A[right] - A[i--];
}
right = i;
}
}
return water;
}
};

扫描两遍:第一遍从左往右,记录当前左边的最大, 第一遍从右往左,记录到当前的最大,根据左边和右边以及自己的数,就可以判断当前是否可以盛水。

class Solution {
public:
int trap(int A[], int n) {
if (n <= ) return ;
int water = , perm[n], tmpMax = ;
for (int i = ; i < n; ++i){
if (tmpMax < A[i-]){
tmpMax = A[i-];
}
perm[i] = tmpMax;
}
tmpMax = ;
for (int i = n - ; i > ; --i){
if (tmpMax < A[i+]){
tmpMax = A[i+];
}
water += min(perm[i], tmpMax) - A[i] > ? min(perm[i], tmpMax) - A[i] : ;
}
return water;
}
};

leetcode 第41题 Trapping Rain Water的更多相关文章

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

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

  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 笔记系列12 Trapping Rain Water [复杂的代码是错误的代码]

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

  4. LeetCode: Trapping Rain Water 解题报告

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

  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] 42. Trapping Rain Water 收集雨水

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

  7. [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 ...

  8. LeetCode:Container With Most Water,Trapping Rain Water

    Container With Most Water 题目链接 Given n non-negative integers a1, a2, ..., an, where each represents ...

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

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

随机推荐

  1. 实例教程Unity3D单例模式(一)通经常使使用方法

    unity3d教程 中的单例模式通经常使使用方法 通经常使使用方法是在相关类增加GetInstance()的静态方法,检查实例是否存在.假设存在,则返回.假设不存在.则返回一个"须要用游戏元 ...

  2. 【Linux&amp;Unix--文件描述叙事的性格和权柄】

    个人学习整理,如有不足之处,请不吝不吝赐教.转载请注明:@CSU-Max 系列博文:                      Linux&Unix学习第一弹 -- 文件描写叙述符与权限  L ...

  3. cocos2dx怎样设置ios和Android横屏竖屏的几种方法

    cocos2d-x编译到ios上.默认是横屏的,若要改为http://竖屏.不同的ios版本号.方法也会不同 在ios7上或许我们设置好了横竖屏.但到了ios6上或许会变化.以下白白给大家分享一下我的 ...

  4. extjs_09_定义自己的页面组件

    1.项目截图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWRhbV93enM=/font/5a6L5L2T/fontsize/400/fill/I0J ...

  5. FutureTask解析(转)

    站在使用者的角度,future是一个经常在多线程环境下使用的Runnable,使用它的好处有两个:1. 线程执行结果带有返回值2. 提供了一个线程超时的功能,超过超时时间抛出异常后返回. 那,怎么实现 ...

  6. Android Bitmap OutOfMemory 解决的方法

    在Android应用里,最耗费内存的就是图片资源.并且在Android系统中.读取位图Bitmap时,分给虚拟机中的图片的堆栈大小仅仅有8M.假设超出了.就会出现OutOfMemory异常 E/And ...

  7. ZooKeeper完全分布式安装和配置

    ZooKeeper简介见官方网站. 1.环境说明 在两台装有centos6.4(32位)的server上安装ZooKeeper,官网建议至少3个节点.资源有限,本次实验就2台了. 须要提前安装jdk. ...

  8. 安装Team Foundation Server 2012过程截图

    原文:安装Team Foundation Server 2012过程截图 专题图 1,下载Team Foundation Server 2012  官方下载: http://www.microsoft ...

  9. httpclient总结

    1.httpclient总结:一.基本知识准备(1)构建URI工具类,URIBuilder(2)HttpResponse类,可以添加Header信息 获取所有Header信息的方法,调用HeaderI ...

  10. Effective C++:条款14:在中小企业资源管理copying表现

    (一) 在一项条款说法auto_ptr和tr1::share_ptr适合heap-based资源.然而,并非所有的资源都heap-based的.换句话说不tr1::shared_ptr 和 auto_ ...