Poke me to solve the problem
Given n non-negative integers representing an elevation map where the width of each bar are 1, compute how much WA ter It is the 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 the Rain Water (blue section) is being trapped.
Problem Solving Analysis:
For each pillar, find the tallest pillar on the left and right side, the area that the pillar can hold is min (Max_left, max_right)-height
We traverse from the back, and for each pillar we can always update its left maximum, but the maximum value on its right, we can do it over and over again Std::max_element
But so T (n) = O (n^2)
We can use space to change the time, first with an array to the right of each column to the maximum value , so T (n) = O (n)
-
classSolution { Public: intTrapintA[],intN) {assert (A! = NULL && n >=0); if(N <=2)return 0; intLeftmax = a[0]; int Rightmax[n]; Rightmax[n-1] = A[n-1]; for(inti = n-2; I >=0; --i) {Rightmax[i]= Max (a[i+1], rightmax[i+1]); } intres =0; for(inti =1; I < n-1; ++i) { Leftmax = Max (Leftmax, a[i-1]); int tmp = min (Leftmax, rightmax[i]); Res+ = Max (0, TMP-A[i]); } returnRes; }};