5969. 摧毁小行星
- 给你一个整数
mass
,它表示一颗行星的初始质量。再给你一个整数数组asteroids
,其中asteroids[i]
是第i
颗小行星的质量。
你可以按 任意顺序 重新安排小行星的顺序,然后让行星跟它们发生碰撞。如果行星碰撞时的质量 大于等于 小行星的质量,那么小行星被 摧毁 ,并且行星会 获得 这颗小行星的质量。否则,行星将被摧毁。
如果所有小行星 都 能被摧毁,请返回 true
,否则返回 false
。
提示:
1 <= mass <= 10^5
1 <= asteroids.length <= 10^5
1 <= asteroids[i] <= 10^5
分析:
由题意这里直接想到的是,当行星的质量大于等于小行星时,直接累加行星的质量,数字的值小的时候可以直接累加当前行星的质量,但是一旦数据量大,并且单个小行星的质量也很大的时候,就不能再准确计算当前行星的质量,这就出现数字溢出的问题了,不管是对于int类型还是long类型它都有特定的范围,所以大于海量的数据,这种累加的办法就不太合适了。
结合题意可以知道,其实小行星的质量一定不会超过10^5,所以当行星的质量大于等于这个值的时候,完全可以确定最后的结果。
// 5969. 摧毁小行星
class Solution {
public boolean asteroidsDestroyed(int mass, int[] asteroids) {
// 如果刚开始行星的质量大于等于10^5时,可以直接返回true
// 因为小行星的质量最大为10^5,所以这样的行星一定可以摧毁所有小行星
if(mass >= 100_000)
return true;
// 先对小行星的数组进行递增排序
// 先让行星处理相对较小的小行星
Arrays.sort(asteroids);
// 记录当前行星的质量
int nowMass = mass;
// 从小到大与小行星碰撞
for(int i = 0; i < asteroids.length; i++){
// 如果当前的小行星质量大于当前的行星质量,则可以直接返回结果
if(asteroids[i] > nowMass)
return false;
// 如果可以销毁小行星,则增加行星的质量
nowMass += asteroids[i];
// 与开头一样,如果行星的质量已经大于可能存在的小行星的最大质量时
// 直接返回结果
if(nowMass >= 100_000)
return true;
}
return true;
}
}