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!

思路:动态规划。第一次存储从开始到i最高的位置,求最高位置a之前的存水量=a与a之前最高位置b之间的水量+b与b之前最高位置c之间的水量...

第二次存储从末尾到i最高的位置,求最高位置a之后的存水量=a与a之前最高位置m之间的水量+m与m之前最高位置n之间的水量...

class Solution {
public:
int trap(vector<int>& height) {
int size = height.size();
if(size==) return ; vector<int> dp(size,); //save the highest position until now
int ret = ;
int left,right; //first traverse from left to right
for(int i = ; i < size; i++){
//state transfer
if(height[i] > height[dp[i-]]) dp[i]=i;
else dp[i] = dp[i-];
} //calculate the water to the left of the highest position
left = dp[size-];
while(left>){
right=left;
left=dp[right-];
for(int i = left+; i < right; i++){
ret += (height[left]-height[i]);
}
} //second traverse from right to highest pos
int highestPos=dp[size-];
dp[size-]=size-;
for(int i = size-; i >= highestPos; i--){
//state transfer
if(height[i] > height[dp[i+]]) dp[i]=i;
else dp[i] = dp[i+];
} //calculate the water to the right of the highest position
right=highestPos;
while(right<size-){
left=right;
right=dp[left+];
for(int i = left+; i < right; i++){
ret += (height[right]-height[i]);
}
} return ret;
}
};

改进:用stack代替vector作为状态存储。stack的栈顶是到目前为止最大元素的下标,因为最高位置是关键,找到最高位置,可以往左,往右计算水位。

stack的实现类似用两个stack实现能够返回最大元素的stack。

class Solution {
public:
int trap(vector<int>& height) {
int size = height.size();
if(size==) return ; stack<int> s;
s.push();
int i, ret = , highestPos; //First traverse from left to right
for(int i = ; i < size; i++){
if(height[i]<=height[s.top()]) continue; s.push(i);
} i=s.top();
highestPos = i;
while(){
if(i==s.top()){
s.pop();
if(s.empty()) break;
}
else{
ret+=(height[s.top()]-height[i]);
}
i--;
} //then traverse from right to left
s.push(size-);
for(int i = size-; i >= highestPos; i--){
if(height[i]<=height[s.top()]) continue; s.push(i);
} i=highestPos;
while(){
if(i==s.top()){
s.pop();
if(s.empty()) break;
}
else{
ret+=(height[s.top()]-height[i]);
}
i++;
}
return ret;
}
};

42. Trapping Rain Water (Array,stack; DP)的更多相关文章

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

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

  2. leetcode 11. Container With Most Water 、42. Trapping Rain Water 、238. Product of Array Except Self 、407. Trapping Rain Water II

    11. Container With Most Water https://www.cnblogs.com/grandyang/p/4455109.html 用双指针向中间滑动,较小的高度就作为当前情 ...

  3. LeetCode 42. Trapping Rain Water 【两种解法】(python排序遍历,C++ STL map存索引,时间复杂度O(nlogn))

    LeetCode 42. Trapping Rain Water Python解法 解题思路: 本思路需找到最高点左右遍历,时间复杂度O(nlogn),以下为向左遍历的过程. 将每一个点的高度和索引存 ...

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

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

  5. LeetCode - 42. Trapping Rain Water

    42. Trapping Rain Water Problem's Link ------------------------------------------------------------- ...

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

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

  7. 刷题42. Trapping Rain Water

    一.题目说明 题目是42. Trapping Rain Water,翻译起来就是"接雨水".给n个非负正数代表高度,每个正数宽度为1,让计算能多少雨水.题目难度是Hard 二.我的 ...

  8. [LeetCode] 42. Trapping Rain Water 收集雨水

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

  9. leetCode 42.Trapping Rain Water(凹槽的雨水) 解题思路和方法

    Trapping Rain Water Given n non-negative integers representing an elevation map where the width of e ...

随机推荐

  1. 杂项-TOOL:NPIO

    ylbtech-杂项-TOOL:NPIO NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作.NPOI是一个开源的Ja ...

  2. Ubuntu终端文件的压缩和解压缩命令

    在Ubntu的终端中压缩和解压缩是每天几乎要用到的命令,由于linux中各种压缩文件类型较多,所以需要记住几个主要的压缩和解压缩命令: 文件类型 执行动作 命令 .tar 解包 tar xvf Fil ...

  3. 操他妈的,jquery1.4以上不能用toggle()轮流切换函数

    query 1.9里面已经删除了toggle(fn1, fn2)函数 (2013-05-07 13:44:27) 转载▼ 标签: it 分类: js jquery 1.9里面已经删除了toggle(f ...

  4. 【C++11新特性】 - 空间配置allocator类

    原文链接: http://blog.csdn.net/Xiejingfa/article/details/50955295 今天我们来讲讲C++的allocator类. C++提供了new和delet ...

  5. css3网站收集

    把群里大家推荐的网站做了下收集,等有时间了研究下 1.http://icomoon.io/app/  这个网站用来生成跟导出字体图标的,自带的图标种类很多很丰富,基本够用了,不过你也可以自己设计,然后 ...

  6. web service初探

    概述:Web service是一个平台独立.低耦合的.自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些应用程序,用于开发 ...

  7. RouterOS 5.16软路由安装图解教程

    说明:RouterOS是一种路由器操作系统,它可以安装到普通的个人电脑上面,替代硬件路由器 RouterOS版本:RouterOS 5.16 硬件要求: 1.支持多核CPU 2.内存最大支持到2G 3 ...

  8. tensorflow data's save and load

    note: if you'll load data,the data shape should be similar with saved data's shape.    -- 中式英语,天下无敌 ...

  9. Win7 系统还原

    Win7 由于某种原因,第二天开机不正常,桌面配置丢失,桌面上的文档不见了. 这种情况不要怕. 可以在启动界面F8,进入系统还原,然后选择某个时间点还原成功!!! 错误描述: Windows 不能加载 ...

  10. 22 网络编程--TCP和UDP实现聊天例子

    1.TCP简单的一次对话,单通信 客户端: import socket HOST = 'localhost' PORT = 50006 client = socket.socket(socket.AF ...