[路飞]_leetcode274 周赛3

198 阅读2分钟

5969. 摧毁小行星

给你一个整数 mass ,它表示一颗行星的初始质量。再给你一个整数数组 asteroids ,其中 asteroids[i] 是第 i 颗小行星的质量。

你可以按 任意顺序 重新安排小行星的顺序,然后让行星跟它们发生碰撞。如果行星碰撞时的质量 大于等于 小行星的质量,那么小行星被 摧毁 ,并且行星会 获得 这颗小行星的质量。否则,行星将被摧毁。

如果所有小行星 都 能被摧毁,请返回 true ,否则返回 false 。

示例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
所有小行星都被摧毁。

题解

不要被示例所迷惑,我们只需要将行星数组从小到大排序;使用mass与行星数组中最小行星开始碰撞,如果mass小于最小行星直接返回false;如果mass大于最小行星,mass+最小行星质量与下一行星质量对比;如果可以撞击最后一颗行星,返回true;

事件复杂度O(N*log(N))

代码

var asteroidsDestroyed = function (mass, asteroids) {
  asteroids = asteroids.sort((a, b) => a - b)
  let start = mass
  for (let i = 0; i < asteroids.length; i++) {
    if (start >= asteroids[i]) {
      start += asteroids[i]
    } else {
      return false
    }
  }
  return true
}