前往
大廳
主題

LeetCode - 2126. Destroying Asteroids 解題心得

Not In My Back Yard | 2022-06-30 12:00:16 | 巴幣 0 | 人氣 167

題目連結:


題目意譯:
你被給定一整數 mass,其代表著一顆行星的原始質量。你又被更進一步地給定一整數陣列 asteroids,其中 asteroids[i] 為第 i 顆小行星的質量。

你可以按照任意順序去排列小行星們並使它們與行星相撞。如果行星的質量大於或等於小行星的質量,則小行星將會被摧毀且行星將獲得小行星的質量;反之,行星將被摧毀。

回傳真(True)如果所有小行星皆可以被摧毀;反之,回傳假(False)。

限制:
1 ≦ mass ≦ 10 ^ 5
1 ≦ asteroids.length ≦ 10 ^ 5
1 ≦ asteroids[i] ≦ 10 ^ 5



範例測資:
範例 1:
輸入: mass = 10, asteroids = [3,9,19,5,21]
輸出: true
解釋: 其中一種排列小行星的方式為 [9,19,5,3,21]:
- 該行星與有著質量 9 的小行星相撞。新的行星質量為 10 + 9 = 19
- 該行星與有著質量 19 的小行星相撞。新的行星質量為 19 + 19 = 38
- 該行星與有著質量 5 的小行星相撞。新的行星質量為 38 + 5 = 43
- 該行星與有著質量 3 的小行星相撞。新的行星質量為 43 + 3 = 46
- 該行星與有著質量 21 的小行星相撞。新的行星質量為 46 + 21 = 67
所有小行星都被摧毀了。

範例 2:
輸入: mass = 5, asteroids = [4,9,23,4]
輸出: false
解釋:
該行星無法得到足夠質量來摧毀有著質量 23 的小行星。
在行星摧毀掉其他的小行星後,它將擁有質量 5 + 4 + 9 + 4 = 22。
該值小於 23,因此撞擊之後它將無法摧毀最後一個小行星。


解題思維:
如果存在一組順序可以讓所有小行星都被摧毀,則我們可以將任意質量的小行星去和在其之後被摧毀的、質量較小的小行星作交換,而這將得到另一組順序且同樣可以使所有小行星都被摧毀。

例如範例 1 中有一組 [9,19,5,3,21],則我們可以把當中的 19 與其後面的 3 交換得到 [9,3,5,19,21]。而這個新順序也是一組可行解。原因很簡單,因為我們一開始可以在第二次撞擊承受質量 19 的小行星,則代表之後不管第幾次也依舊可以承受質量 19 的小行星,同時也保證著質量 < 19 的小行星在第二次之後也可以隨時被摧毀。

因此可以看到如果有可行解的話,必存在一組順序是將小行星們按照質量大小由小排到大。

所以我們可以先將小行星按照質量大小由小排到大,然後令該行星從小的開始摧毀並增長其質量。如果可以成功全數摧毀,則回傳真;反之,則代表其他順序也不可能會成功,因此回傳假。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作