摧毁小行星
难度:
标签:
题目描述
代码结果
运行时间: 103 ms, 内存: 29.7 MB
/*
* 思路:
* 使用 Java Stream 进行小行星数组的排序和遍历。
* 通过 reduce 方法累加行星的质量并判断是否能摧毁所有小行星。
*/
import java.util.Arrays;
public class Solution {
public boolean canDestroyAllAsteroids(int mass, int[] asteroids) {
return Arrays.stream(asteroids)
.sorted()
.mapToLong(Long::valueOf)
.reduce((planetMass, asteroidMass) -> planetMass >= asteroidMass ? planetMass + asteroidMass : -1)
.orElse(-1) != -1;
}
}
解释
方法:
这个题解采取了一个迭代的方法来处理小行星的摧毁问题。初始时,考虑所有的小行星,并试图摧毁它们。对于当前的小行星列表,遍历每颗小行星,如果当前行星的质量大于或等于小行星的质量,则摧毁它并增加行星的质量;如果不是,则将这颗小行星保留到下一个列表中。如果一轮遍历后没有任何小行星被摧毁(即下一个列表的长度与当前列表相同),则返回False。如果所有的小行星都被摧毁了(即下一个列表为空),则返回True。
时间复杂度:
O(n^2)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么选择迭代逐个检查小行星,而不是先对小行星数组进行排序来尝试优化算法效率?
▷🦆
在题解中提到,如果一轮遍历后没有任何小行星被摧毁,则返回False。这种情况是如何判断的,能否详细解释其逻辑?
▷🦆
在解法中,如果小行星的质量大于行星的质量,就将小行星放入下一轮列表。这种处理方式是否意味着算法对小行星的处理顺序非常敏感?
▷