題目連結(jié):
題目意譯:
現(xiàn)在有 n 個機(jī)器人,索引值從 1 開始數(shù),每一個各自有自己的在數(shù)線上的位置、血量以及移動方向。
你被給定兩個索引值從 0 開始數(shù)的整數(shù)陣列 positions 、 healths 以及一個字串 directions(directions[i] 只會是 'L',代表著往左;或是 'R',代表著往右)。positions 中所有整數(shù)彼此相異。
所有機(jī)器人會同時以等速率往它們既定的面對方向移動。如果有兩個機(jī)器人在移動時位置有所重疊,則它們將會碰撞在一起。
如果兩個機(jī)器人發(fā)生碰撞,則較低血量的機(jī)器人將會被移除,而較高者的血量會被減去 1。存活下來的機(jī)器人將會繼續(xù)往原本的方向移動;如果兩個機(jī)器人血量一樣,則兩者同時被移除。
你的任務(wù)是決定出哪些機(jī)器人將會經(jīng)過碰撞後繼續(xù)存活,其需要按照給定的順序列舉。即機(jī)器人 1 的最終血量(若有存活),接著機(jī)器人 2 的最終血量(若有存活),以此類推。如果沒有任何倖存者,則回傳空陣列。
回傳一個陣列包含著剩餘的機(jī)器人之血量(同上,順序應(yīng)按照原本的給定的順序排列),代表著所有碰撞結(jié)束之後的最終血量。
注: positions 可能沒有經(jīng)過排序。
限制:
1 ≦ positions.length == healths.length == directions.length == n ≦ 10 ^ 5
1 ≦ positions[i], healths[i] ≦ 10 ^ 9
directions[i] == 'L' 或 directions[i] == 'R'
positions 中所有數(shù)值彼此相異。
範(fàn)例測資:
範(fàn)例 1:
輸入: positions = [5,4,3,2,1], healths = [2,17,9,15,10], directions = "RRRRR"
輸出: [2,17,9,15,10]
解釋: 此例中沒有碰撞發(fā)生,因?yàn)樗袡C(jī)器人都往同一個方向移動。所以回傳 [2, 17, 9, 15, 10]。
範(fàn)例 2:
輸入: positions = [3,5,2,6], healths = [10,10,15,12], directions = "RLRL"
輸出: [14]
解釋: 此例中有 2 次碰撞。一次為機(jī)器人 1 和機(jī)器人 2 將會碰撞。而由於兩者血量一樣,兩者都會被直接移除掉;接著,機(jī)器人 3 和機(jī)器人 4 將會碰撞。而由於機(jī)器人 4 的血量較低,只有它會被移除。而機(jī)器人 3 的血量變?yōu)?15 - 1 = 14。只有機(jī)器人 3 存活,因此我們回傳 [14]。
範(fàn)例 3:
輸入: positions = [1,2,5,6], healths = [10,10,11,11], directions = "RLRL"
輸出: []
解釋: 機(jī)器人 1 和機(jī)器人 2 將會碰撞。而由於兩者血量一樣,兩者都會被直接移除掉;機(jī)器人 3 和 4 將會碰撞。而由於兩者血量一樣,兩者都會被直接移除掉。所以我們回傳一個空陣列 []。
解題思維:
這題的變化版。只是此時的情況某方面來說更單純,因?yàn)橐淮闻鲎脖囟ㄖ辽贂幸粋€機(jī)器人直接消失,再加上兩者「中間」不會有其他的機(jī)器人存在。使得檢查過程變得更單純一點(diǎn)。
一樣,由於我們是由左往右看(現(xiàn)在假設(shè)已經(jīng)將 positions 排序了。記得要保留原本的索引值,因?yàn)榛貍鞔鸢笗r要用的是原本的索引值來排),所以堆疊裡放的資訊只會是「往右」的機(jī)器人之位置和血量(也可以用索引值代替這兩個資訊)。
而遇到「往左」的機(jī)器人時,就一直拿出堆疊頂端的機(jī)器人並按照題目敘述判斷碰撞結(jié)果直到堆疊變空或是「往左」的機(jī)器人消滅為止。
最後根據(jù)原本的索引值掃過一次哪些機(jī)器人最後血量有 > 0 即可找到所求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。