比较、排序、数字溢出[5969] 摧毁小行星

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;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值