package Ġio . undefined Ċ Ċ import Ġio . utils . run Tests Ċ Ċ // Ġhttps :// leetcode . com / problems / tr apping - rain - water / Ċ class ĠTr apping Rain Water Ġ{ ĊĊĠ Ġ// Ġhttps :// leetcode . com / problems / tr apping - rain - water / dis cuss / 1 7 3 9 1 / Share - my - short - solution . ĊĠ Ġfun Ġexecute ( height s : ĠInt Array ): ĠInt Ġ{ ĊĠĠĠ Ġvar Ġstart Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġend Ġ= Ġheight s . last Index ĊĠĠĠ Ġvar Ġmax Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġleft Max Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġright Max Ġ= Ġ 0 ĊĠĠĠ Ġwhile Ġ( start Ġ<= Ġend ) Ġ{ ĊĠĠĠĠĠ Ġleft Max Ġ= Ġmax Of ( left Max , Ġheight s [ start ]) ĊĠĠĠĠĠ Ġright Max Ġ= Ġmax Of ( right Max , Ġheight s [ end ]) ĊĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġleft Max Ġ< Ġright Max Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġleft Max Ġis Ġsmaller Ġthan Ġright Max , Ġso Ġthe Ġ( left max - A [ a ]) Ġwater Ġcan Ġbe Ġstored ĊĠĠĠĠĠĠĠĠĠ Ġmax Ġ+= Ġleft Max Ġ- Ġheight s [ start ] ĊĠĠĠĠĠĠĠĠĠ Ġstart ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġmax Ġ+= Ġright Max Ġ- Ġheight s [ end ] ĊĠĠĠĠĠĠĠĠĠ Ġend -- ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġmax ĊĠ Ġ} ĊĊĠ Ġfun Ġexecute 1 ( height s : ĠInt Array ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġmutable Set Of < Pair < Int , ĠInt >>() ĊĠĠĠ Ġval Ġto wers Ġ= Ġmutable ListOf < Pair < Int , ĠInt >>() ĊĊĠĠĠ Ġloop @ Ġfor Ġ( index Ġin Ġheight s . indices ) Ġ{ ĊĠĠĠĠĠ Ġval Ġvalue Ġ= Ġheight s [ index ] ĊĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ> Ġ 0 ) Ġto wers . add ( index Ġto Ġvalue ) ĊĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( height s [ index Ġ- Ġ 1 ] Ġ< Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tow ers . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġadd Values ( height s , Ġto wers , Ġvalue , Ġindex , Ġresult ) ĊĠĠĠĠĠĠĠĠĠ Ġremove Invalid Tow ers ( tow ers , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġto wers . add ( index Ġto Ġvalue ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġresult . size ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġadd Values ( height s : ĠInt Array , Ġto wers : ĠMutable List < Pair < Int , ĠInt >>, Ġcurrent Value : ĠInt , ĠcurrentIndex : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult : ĠMutable Set < Pair < Int , ĠInt >>) Ġ{ ĊĠĠĠ Ġfor Ġ( pair Ġin Ġto wers . reversed ()) Ġ{ ĊĠĠĠĠĠ Ġgenerate All Values ( height s , Ġpair . first , ĠcurrentIndex , Ġmin Of ( current Value , Ġpair . second ), Ġresult ) ĊĠĠĠĠĠ Ġif Ġ( pair . second Ġ>= Ġcurrent Value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġgenerate All Values ( height s : ĠInt Array , Ġindex 0 : ĠInt , Ġindex 1 : ĠInt , ĠmaxHeight : ĠInt , Ġresult : ĠMutable Set < Pair < Int , ĠInt >>) Ġ{ ĊĠĠĠ Ġ( index 0 Ġ+ Ġ 1 Ġuntil Ġindex 1 ). forEach Ġ{ Ġrow Ġ-> ĊĠĠĠĠĠ Ġval ĠminHeight Ġ= Ġheight s [ row ] ĊĠĠĠĠĠ Ġ( min Height Ġuntil ĠmaxHeight ). forEach Ġ{ Ġcol Ġ-> Ġresult . add ( row Ġto Ġcol ) Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġremove Invalid Tow ers ( tow ers : ĠMutable List < Pair < Int , ĠInt >>, Ġvalue : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġindex ToRemove Ġ= Ġmutable ListOf < Int >() ĊĠĠĠ Ġfor Ġ( index Ġin Ġto wers . last Index Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġval Ġpair Ġ= Ġto wers [ index ] ĊĠĠĠĠĠ Ġif Ġ( pair . second Ġ>= Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġindex ToRemove . add ( index ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġindex ToRemove . forEach Ġ{ Ġto wers . remove At ( it ) Ġ} ĊĠ Ġ} Ċ } Ċ Ċ fun Ġmain () Ġ{ ĊĠ Ġrun Tests ( listOf ( ĊĠĠĠĠĠ Ġint ArrayOf ( 0 , Ġ 1 , Ġ 0 , Ġ 2 , Ġ 1 , Ġ 0 , Ġ 1 , Ġ 3 , Ġ 2 , Ġ 1 , Ġ 2 , Ġ 1 ) Ġto Ġ 6 , ĊĠĠĠĠĠ Ġint ArrayOf ( 2 , Ġ 0 , Ġ 2 ) Ġto Ġ 2 , ĊĠĠĠĠĠ Ġint ArrayOf ( 0 , Ġ 3 , Ġ 0 , Ġ 2 , Ġ 1 , Ġ 0 , Ġ 1 , Ġ 3 , Ġ 2 , Ġ 1 , Ġ 2 , Ġ 1 ) Ġto Ġ 1 2 , ĊĠĠĠĠĠ Ġint ArrayOf ( 4 , Ġ 1 , Ġ 3 , Ġ 0 , Ġ 1 , Ġ 0 , Ġ 2 , Ġ 7 ) Ġto Ġ 1 7 ĊĠ Ġ)) Ġ{ Ġ( input , Ġvalue ) Ġ-> Ġvalue Ġto ĠTr apping Rain Water (). execute ( input ) Ġ} Ċ }