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.

思路:

我自己的想法,先遍历一遍数组找到所有的山峰位置,在例子中是1,3,7,10,然后再填充两个山峰之间的水,获得水量

class Solution {
public:
int trap(int A[], int n) {
bool haswater = false;
vector<int> peak;
int ans = ;
for(int i = ; i < n - ; i++) //找到第一个山峰
{
if(A[i] > A[i + ])
{
peak.push_back(i);
break;
}
}
if(peak.empty())
{
return ; //没有山谷 没水
}
int maxheight = A[peak[]];
for(int i = peak[] + ; i < n; i++) //找剩下的山峰
{
if(A[i] > A[i - ]) //比上一个值大 新山峰
{
while(A[i] > A[peak.back()] && A[peak.back()] < maxheight) //比之前的山峰高,且之前的山峰不是最高峰,删掉之前的 第一个山峰不能删
{
peak.pop_back();
}
maxheight = (A[i] > maxheight) ? A[i] : maxheight; //新的最高峰
peak.push_back(i);
}
} for(int i = ; i < peak.size() - ; i++) //获得水量 依次向两个山峰间加水
{
int height = min(A[peak[i]], A[peak[i+]]); //水平面是两个山峰中矮一点的那个
for(int j = peak[i] + ; j < peak[i+]; j++)
{
ans += max(height - A[j], ); //防止5 4 1 2 这种水平面比中间非山峰处低的情况
}
} return ans;
}
};

大神的思路:没有像我一样先找所有的山峰,而是边遍历边获得每个坐标位置的水量。 而且大神是左右两边收缩的。

class Solution {
public:
int trap(int A[], int n) {
int left=; int right=n-;
int res=;
int maxleft=, maxright=;
while(left<=right){ //没有遍历结束
if(A[left]<=A[right]){ //如果右边比较高 则处理左边
if(A[left]>=maxleft) maxleft=A[left]; //如果当前的值比左边最大值还大,那更新最大值 这个位置不会有水
else res+=maxleft-A[left]; //如果比左边最大值小那当前值一定在山谷 左边比左边最大值小 右边比右值小
left++;
}
else{
if(A[right]>=maxright) maxright= A[right];
else res+=maxright-A[right];
right--;
}
}
return res;
}
};

【leetcode】Trapping Rain Water(hard)的更多相关文章

  1. 【题解】【直方图】【Leetcode】Trapping Rain Water

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

  2. 【leetcode】Trapping Rain Water

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

  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. [array] leetcode - 42. Trapping Rain Water - Hard

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

  6. [LeetCode] 407. Trapping Rain Water II 收集雨水 II

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

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

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

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

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

  9. LeetCode - 42. Trapping Rain Water

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

随机推荐

  1. 使用JS调用WebService接口

    <script> $(document).ready(function () { var username = "admin"; var password = &quo ...

  2. 项目中的那些事---PHP函数

    总结工作中遇到的php函数: 1.查找:strpos("str", "substr"): 查找substr字符串在str字符串中出现的位置 第一个参数是:被查找 ...

  3. browserify.js 的模块加载

    browserify的模块加载基本上和nodejs的类似: nodejs 的模块加载是依次去读取文件然后用一个类eval() 函数执行并返回module.exports的结果.为了避免循环加载,在加载 ...

  4. 急缺【jQuery】人才,要求熟悉jQuery,熟悉Js,熟悉前端开发

    是一份兼职 是与jQuery相关的写作任务,有写作兴趣的欢迎站短(有blog者优先). 要求就是熟悉js和jquery,项目经验丰富(项目经验一定要丰富). 钱不多,不到1W,如果月薪超过1W的,我想 ...

  5. 洛古 P1373 小a和uim之大逃离

    P1373 小a和uim之大逃离 题目提供者lzn 标签 动态规划 洛谷原创 难度 提高+/省选- 题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电 ...

  6. KnockoutJS(2)-监控属性

    本节主要涉及到3个内容: 1. 监控属性 Observables (这个用的比较多,但是其本身使用比较简单,唯一需要注意就是,它监控的对象是一个方法,所以取值和设置值的时候容易混淆) 2. 计算属性  ...

  7. DTCMS会员中心快速更改样式思路

    非常简便 制作一个public.css文件,包含网站头部和底部的样式代码 每个会员中心模版导入这个文件就可以 把原先style.css的头部和底部样式代码删除

  8. C#对象转JSON字符串和JSON字符串转对象

    namespace Net.String.ConsoleApplication { using System; using System.Data; using System.Collections; ...

  9. 【C#】 开机启动/取消开机启动

    1.开机启动 using Microsoft.Win32; RegistryKey runKey = Registry.LocalMachine.CreateSubKey(@"SOFTWAR ...

  10. 一个例子说明如何在DataSnap中使用FireDAC

    一.FireDAC调用DataSnap远程方法查询数据示例 1.服务端使用FDQUERY查询数据并返回TDATASET: function TServerMethods1.GetData(var sq ...