LeetCode42. Trapping Rain Water

来源:互联网 发布:ubuntu 14.04 iso 32 编辑:程序博客网 时间:2024/06/18 04:59

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.

这里写图片描述
时间复杂度(O(n))
空间复杂度(O(1))

#include<vector>#include<iostream>using namespace std;class Solution {public:    int trap(vector<int>& height) {        int n=height.size();        if(n<2) return 0;        int left=0,right=n-1,res=0,minh=0;        while(left<right){             minh=min(height[left],height[right]);             if(minh==height[left]){                 while((++left<right)&&(height[left]<minh)){                     res=res+minh-height[left];                 }             }else{                 while((--right>left)&&(height[right]<minh)){                     res=res+minh-height[right];                 }                        }        }        return res;    }};void main(){    int a[]={0,1,0,2,1,0,1,3,2,1,2,1},n=12;    vector<int> height;    height.reserve(n);    height.assign(&a[0],&a[n]);    Solution So;    int res=So.trap(height);    cout<<res<<endl;}
#include<vector>#include<iostream>using namespace std;class Solution {public:    int trap(vector<int>& height) {        int n=height.size();        if(n<2) return 0;        int left=0,right=n-1,res=0,i=0,j=0,s=0,d=0;        while(left<right){            while((left<n-1)&&(height[left]<height[left+1])){                ++left;            }            while((right>0)&&(height[right]<height[right-1])){                --right;            }            if(height[left]<height[right]){                 i=left+1;                 s=0;                 while((i<right)&&(height[left]>height[i])){                     s=s+height[i];                     ++i;                 }                 d=i-left-1;                 if(d>0){                     res=res+height[left]*d-s;                                }                 left=i;                        }else{                 j=right-1;                 s=0;                 while((j>left)&&(height[right]>height[j])){                     s=s+height[j];                     --j;                                 }                 d=right-j-1;                 if(d>0){                     res=res+height[right]*d-s;                               }                 right=j;               }               }        return res;    }};void main(){    int a[]={0,1,0,2,1,0,1,3,2,1,2,1},n=12;    vector<int> height;    height.reserve(n);    height.assign(&a[0],&a[n]);    Solution So;    int res=So.trap(height);    cout<<res<<endl;}

这里写图片描述

0 0