最近遇到的面試問題在glassdoor樣的網站排在之間加水,我不能找到一個優化的解決方案來解決這個問題:條形圖
這跟捕水問題。請閱讀示例。
給定輸入數組,其每個元素表示塔的高度時,水的量將被傾倒和索引號指示每個塔的澆注水position.The寬度爲1.打印注水後的曲線圖。
注:
使用
*
來指示塔,w
來表示1升量的水。澆注位置永遠不會在高峯位置。無需考慮分水情況。
(A獎金點,如果你給這種情況下的解決方案,則可以假定,如果在峯值位置澆注Ñ水,N/2水進入到左,N/2水前進到右側)
一個峯的定義:峯值位置的高度比它旁邊的兩個左和右指數大於)
假設有2周極端高壁位於接近直方圖。
因此,如果水量超過直方圖的容量,您應該指出容量數量並繼續。見例2.假設水會向左走第一,見例1
例1:
int[] heights = {4,2,1,2,3,2,1,0,4,2,1}
It look like:
* *
* * **
** *** **
******* ***
+++++++++++ <- there'll always be a base layer
431
Assume given this heights array, water amout 3, position 2:
打印:
* *
*ww * **
**w*** **
******* ***
+++++++++++
例2:
int[] heights = {4,2,1,2,3,2,1,0,4,2,1}, water amout 32, position 2
打印:
capacity:21
wwwwwwwwwww
*wwwwwww*ww
*www*www**w
**w***ww**w
*******w***
+++++++++++
起初我以爲這就像the trapping water problem,但我錯了。有沒有人有算法來解決這個問題?
歡迎對代碼進行解釋或評論。
注:
捕水問題問的能力,但這個問題引入了兩個變量:水量與灌注指數。此外,水有流動的偏好。所以它不像陷水問題。
如果澆注位置是3,你想向左走水吧(最深的谷和最大的容量),還是隨機? – m69
@ m69先離開。如果左邊部分已滿/無法加水,請右轉。 – KK25
那似乎很簡單。製作一個2D網格,在每一滴水的頂部開始,向下,如果這是不可能的,向左走,如果這是不可能的,重複直到你陷入困境,重複每一滴水。 (想想看,你可能需要通過最上層的下降層來查看該層上是否有更多空間,然後如果沒有,則回溯。嗯,它畢竟不是那麼簡單:-) ) – m69