Leetcode-42 Trapping in Rain Water

来源:互联网 发布:知乎提问有什么话题 编辑:程序博客网 时间:2024/04/30 06:30

题目:

           

示例输入:                                                                                                 示例输出:

12                 (表示积水的宽度)                                                                 6

0 1 0 2 1 0 1 3 2 1 2 1


分析:

对于本题,找到积水的总面积,那么只要找到每个积水的竖条水柱的面积,然后相加,就能求出总面积。而对于每个积水的竖条水柱,其面积这里也就简化为其高度,如果说我们知道该竖条水柱所在的积水区域水面所处的高度,然后减去该竖条水柱下黑框的高度即可求出该竖条水柱的高度。可能比较抽象,这里以上面的积水图片为例介绍下,现在给每个竖条编号如下:

                                                                             

      那么比如对于第二块积水,其水面高度为2,而下标为4和6的高度为1,那么4,6的每个都拥有高度为1的积水,同理,下标为5的竖条水柱高度就为2,那么就可以得到第二块积水的面积为1+2+1=4,然后求出每个积水区域面积或每个竖条水柱的高度之和即可。

      而竖条水族下的黑框高度即对应输入的数组中的值,而每块积水的高度则等于其左右墙壁中较低的那面墙壁的高度, 现在分别用left[i]和right[i]表示下标为i的竖条水柱所在积水的左,右侧墙壁的值,至于left[i]和right[i],其实就分别是下标0到i黑框高度的最大值和下标i到n-1黑框高度的最大值,最后取下标0到i黑框高度的最大值中最大值即可求得该积水的水面的高度,下面的步骤上述已介绍。

    那么就不多废话,直接贴上源代码:

#include<iostream>#include<vector>using namespace std;#define Max 10000vector<int> arr;int N;int solve(){int left[Max],right[Max],result=0;for(int i=0;i<N;i++){left[i]=(i==0?arr[0]:max(left[i-1],arr[i]));}for(int i=N-1;i>=0;i--){right[i]=(i==N-1?arr[N-1]:max(right[i+1],arr[i]));}for(int i=0;i<N;i++){result+=min(left[i],right[i])-arr[i];}return result;}int main(){cin>>N;for(int i=0;i<N;i++){int temp;cin>>temp;arr.push_back(temp);}cout<<solve()<<endl;return 0;}

PS:最近看两本《挑战》书,遇到了相同的内容,于是又看了些算法视频,跟着刷了一些题目,美滋滋~

0 0