Trapping Rain Water

来源:互联网 发布:js placeholder赋值 编辑:程序博客网 时间:2024/06/04 18:37

Description:
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.

这里写图片描述

#include <iostream>#include <vector>#include <algorithm>using namespace std;//分析:分层处理,这里是3层(即vec的最大值)class Solution_1{public:    int trapRainWater(vector<int> &vec)    {        vector<int>::iterator iter_first,iter_last;        int water_hold = 0;        int vec_max = vec[0];        int vec_size = vec.size();        for (size_t i=1; i < vec_size ; i++)        //找出最大值        {            if (vec[i] > vec_max)                vec_max = vec[i];        }        for (int i =1; i <=3 ; ++i )        {            for (auto it = vec.begin(); it != vec.end()-1 ; ++it) //找出第一个大于等于1的位置            {                if (*it >= 1)                {                    iter_first = it;                    break;                }            }            for (auto it = vec.end()-1; it != vec.begin() ; --it)   //找出最后一个大于等于1的位置            {                if (*it >= 1)                {                    iter_last = it;                    break;                }            }            for (auto it = iter_first; it < iter_last + 1; ++it)            {                *it = *it -1;                if (*it < 0)  //判断是否小于0                    water_hold++;            }        }        return water_hold;    }};// 首先找到最高的,然后从左往最高处扫,碰到一个数A[i],计算A[0,,,i-1]最高的是否高过A[i],// 如果是,则A[i]上的水的体积为max(A[0...i-1])-A[i],否则为0并且更新最大值.//从右往最高处再同样扫一遍class Solution_2{public:    int trapRainWater(vector<int> &vec)    {        size_t n = vec.size();        if ( n <= 2) return 0;        size_t max_index = 0;        int sum_left = 0;        int sum_right = 0;        for (size_t i=1; i < n ; ++i)        {            if (vec[i] > vec[max_index])                max_index = i;        }        for (size_t i = 1; i < max_index ; ++i)     //从左边到最高点        {            int pre_max = vec[0];            if (vec[i] > pre_max)                pre_max = vec[i];            else                sum_left += pre_max - vec[i];        }        for (size_t i = n-2; i > max_index ; --i)     //从右边到最高点        {            int pre_max = vec[n-1];            if (vec[i] > pre_max)                pre_max = vec[i];            else                sum_right += pre_max - vec[i];        }        return sum_left + sum_right;    }};int main(){    vector<int> water_trap ={0,1,0,2,1,0,1,3,2,1,2,1};    int water_hold = 0;    Solution_1 solution_1;    water_hold = solution_1.trapRainWater(water_trap);    cout<<"the volume of trap water is: "<<water_hold<<endl;    Solution_2 solution_2;    water_hold = solution_2.trapRainWater(water_trap);    cout<<"the volume of trap water is: "<<water_hold<<endl;    return 0;}

这里写图片描述

0 0
原创粉丝点击