the algorithm is correct as I tried using many test cases and the answer was correct everytime.. anyways, I'm giving you a detailed explanation, that wil help u better understand it...
Consider this test case :
Buildings are : 2 3 6 1 5 2 (represented by their heights)
Days are : 6 2 1 5 3 ( represents the n-th day for which we have to find regions)
Hence, vector
hts will contain { 2,3,6,1,5,2 }
and vector
dts will contain {6, 2, 1 , 5, 3 }
Now, vector
dp is supposed to contain the "number of regions" "
"for every possible day" starting from day 0 to day N ( where N is the day after which all the "buildings" will be flooded - which means N=maximum height of all buildings. ) For our problem, let N= {0,1....6} (as 6 is the last day i.e. for any day > 6, the number of regions is 0 ).
So let us assume
dp.assign(7,0);
, that wil make it easier to understand.
So vector
dp contains: {0,0,0,0,0,0,0}
And we have a temporary variable "
cur" which tells the height of the building "just before" the current one.
Now here's what happens : (Note all "increments" are by 1 )
1 2 3 4 5 6 7 8 9 10 11 12
|
0 cur -> 0
1 Run the loop from 0 to hts.size() (i.e. <number of buildings>)
2 If the current building's height is greater than "cur" (i.e. <height of prev. building>)
3 Set cur -> hts[i] - 1
4 Else
5 Increment all the values in "dp" from hts[i] to cur
6 Set cur -> hts[i] -1
7 EndIf
8 end loop
9 Increment all the values in "dp" from 0 to "cur"
10 "dp" contains the number of regions of every possible day
11 extract from "dp" the "required" solutions only, and return them as "ans"
|
Now lets ur dry run this on our test case :
Initially,
hts ={ 2,3,6,1,5,2 }
dts = {6, 2, 1 , 5, 3 }
dp = {0,0,0,0,0,0,0}
cur=0
Now how my algo works is to go forward in hts array, until it finds a "drop" in height of the building.
In the given case, the drop occurs at (6 -> 1) & (5 -> 2)
Now take the 1st drop i.e " 6 -> 1 " : increment all values from
dp[1] to
dp[5]
hence,
dp = { 0,1,1,1,1,1,0 }
Now take the 2nd drop i.e. "5 -> 2" : increment all values from
dp[2] to
dp[4]
hence
dp = { 0,1,2,2,2,1,0 }
Finally, the LOOP ends here and STEP 9 is executed i.e. to increment all values from
dp[0] to
dp[cur] & cur=2-1=1
hence
dp= { 1,2,2,2,2,1,0 }
This is the final
dp, which means :
at day 0 : no. of regions=1
at day 1 : no. of regions = 2
.
.
.
at day 5 : no. of regions = 1
at day 6&above : no. of regions =0
finally, the
ans vector will contain : { 0,2,1,2,2 }
You can test run the algo on any test case,it works! But it looks to me the algorithm is quite efficient,, but not the implementation....