LeetCode - 42. Trapping Rain Water

简介: 42. Trapping Rain Water  Problem's Link  ---------------------------------------------------------------------------- Mean:  在坐标上给你一些竖直放置的条形积木,问你这个积木能够容纳多少液体.

42. Trapping Rain Water 

Problem's Link

 ----------------------------------------------------------------------------

Mean: 

在坐标上给你一些竖直放置的条形积木,问你这个积木能够容纳多少液体.

analyse:

首先找出最高的积木,然后从前往后一直扫到最高积木,从后往前一直扫到最高积木,两部分体积相加即可.

Time complexity: O(N)

 

view code

/**
* -----------------------------------------------------------------
* Copyright (c) 2016 crazyacking.All rights reserved.
* -----------------------------------------------------------------
*       Author: crazyacking
*       Date  : 2016-03-05-22.10
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long( LL);
typedef unsigned long long( ULL);
const double eps( 1e-8);

class Solution
{
public :
    int trap( vector < int >& height)
    {
        int len = height . size (), front = 0 , res = 0;
        int max_height = 0 , max_idx = len - 1;
        for( int i = 0; i < len; ++ i)
        {
            if( max_height < height [ i ])
            {
                max_height = height [ i ];
                max_idx = i;
            }
        }

        while( front < max_idx)
        {
            while( front + 1 < max_idx && height [ front ] < height [ front + 1 ])
                ++ front;
            int stone = 0;
            int back = front + 1;
            while( back < max_idx && height [ back ] < height [ front ])
            {
                stone += height [ back ];
                ++ back;
            }
            res +=( back - front - 1) * height [ front ] - stone;
            front = back;
        }

        int back = len - 1;
        while( back > max_idx)
        {
            while( back - 1 > max_idx && height [ back ] < height [ back - 1 ])
                -- back;
            int stone = 0;
            int front = back - 1;
            while( front > max_idx && height [ front ] < height [ back ])
            {
                stone += height [ front ];
                -- front;
            }
            res +=( back - front - 1) * height [ back ] - stone;
            back = front;
        }
        return res;
    }
};

int main()
{
    freopen( "H: \\ Code_Fantasy \\ in.txt" , "r" , stdin);
    int n;
    while( cin >>n)
    {
        vector < int > ve;
        for( int i = 0; i <n; ++ i)
        {
            int tempVal;
            cin >> tempVal;
            ve . push_back( tempVal);
        }
        Solution solution;
        cout << solution . trap( ve) << endl;
    }
    return 0;
}
/*

*/

 

2.方法二:时间O(n),空间(1)

class Solution
{
public :
    int trap( vector < int >& height)
    {
        int left = 0 , right = height . size() - 1;
        int maxLeft = 0 , maxRight = 0;
        int res = 0;
        while( left < right)
        {
            if( height [ left ] <= height [ right ])
            {
                if( height [ left ] > maxLeft)
                    maxLeft = height [ left ];
                res += maxLeft - height [ left ];
                left ++;
            }
            else
            {
                if( height [ right ] > maxRight)
                    maxRight = height [ right ];
                res += maxRight - height [ right ];
                right --;
            }
        }
        return res;
    }
};
目录
相关文章
|
人工智能 容器
Leetcode 11. Container With Most Water
题目可以这么理解,在i位置有条高为ai的竖线,让你选出两台竖线构成一个容器,使得该容器装的水最多,注意容器不能倾斜。
47 3
Leetcode 365. Water and Jug Problem
一句话理解题意:有容积为x和y升的俩水壶,能不能量出z升的水。 我刚开始看到这题,立马就想了下暴力搜索的可能性,但考虑了下数据大小,立马放弃这个暴力的想法,于是意识到肯定有比较简单的数学方法,其实我自己没想到,后来看还是看了别人的代码,很多博客都直接给出了解法, 但没介绍为什么能这么解。所以我决定解释下我自己的思路。
48 0
LeetCode 417. Pacific Atlantic Water Flow
给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度。“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。 规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。 请找出那些水流既可以流动到“太平洋”,又能流动到“大西洋”的陆地单元的坐标。
109 0
LeetCode 417. Pacific Atlantic Water Flow
LeetCode 407. Trapping Rain Water II
我们把最外面的四边当成四面墙,想象海水面不断的升高,首先会浸过墙面最低的格子,如果墙面最低格子的四周(出了在墙面的格子)有比它矮的格子,那么这就可以形成一个蓄水池,蓄水池的最高高度就是墙面最低的格子,于是我们计算这个蓄水池可以获得的蓄水量;然后这个蓄水池被添加到墙面中;继续在墙面中找最低的格子;
98 0
LeetCode 407. Trapping Rain Water II
|
索引
LeetCode 42 Trapping Rain Water
给定n个非负整数,每个非负整数表示一个宽度为1的柱子,计算下雨后能够捕获多少水.
71 0
LeetCode 42 Trapping Rain Water
|
机器学习/深度学习 PHP 索引
[Leetcode 之 PHP 解析 (42. Trapping Rain Water)
[Leetcode 之 PHP 解析 (42. Trapping Rain Water)
106 0
[Leetcode 之 PHP 解析 (42. Trapping Rain Water)
|
容器
Leetcode-Medium 11. Container With Most Water
Leetcode-Medium 11. Container With Most Water
98 0
Leetcode-Medium 11. Container With Most Water
|
容器
LeetCode - 11. Container With Most Water
11. Container With Most Water  Problem's Link  ---------------------------------------------------------------------------- Mean:...
1009 0
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
113 2