【LeetCode 30天挑战活动】Day 12. Last Stone Weight

谁能想到我今天才做day12的题呢
小说误国!!小说误国啊!!!(痛心!!

题目描述(来自力扣)

有一堆石头,每块石头的重量都是正整数。
每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:
如果 x == y,那么两块石头都会被完全粉碎;
如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。
最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。
示例:
输入:[2,7,4,1,8,1]
输出:1
解释:
先选出 7 和 8,得到 1,所以数组转换为 [2,4,1,1,1],
再选出 2 和 4,得到 2,所以数组转换为 [2,1,1,1],
接着是 2 和 1,得到 1,所以数组转换为 [1,1,1],
最后选出 1 和 1,得到 0,最终数组转换为 [1],这就是最后剩下那块石头的重量。

解题思路

要取最大的两个数比较,首先想到排序,而且根据这道题目的意思,每次都要取当前的最大值,也就是每次操作后都要进行重新排序。因此,大概整理思路:
(1)对数组进行排序
(2)取最大的两个数进行比较(也就是数组最后两个数),根据是否相等做出相应处理
(3)对处理过后的数组重新进行排序
(4)重复(1)(2)(3)直至全部处理完毕

对于上述步骤,有两个地方需要细化:
(1)如何处理两个最大值
现在有的是一个定长数组且其中元素都是大于等于1的正整数,那么不用费心去想那些被“粉碎”的石头是不是要从数组中删去,可以直接将他们设为0
对于具体操作,直观想法肯定是判断是否相等,如果不等就将y设为y-x,将x设为0,如果相等,则将二者都设为0。但事实上这一步在具体操作时可以优化,不需要分情况判断,直接将y设为y-x,而x设为0即可,这样就已经涵盖了二者相等的情况

(2)如何判断处理完毕
用一个for循环进行处理,以数组长度为循环次数,这样一定可以保证循环结束即处理完毕,但这样处理会存在很多无效操作,因此可以在循环中判断,当排序过后的数组倒数第二个数为0,也就是除了倒数第一个元素外,不再存在有效值时,就可以退出循环返回结果了

根据上述分析,可以比较容易地写出代码:

class Solution {
    public int lastStoneWeight(int[] stones) {
        if (stones == null || stones.length == 0) {
            return 0;
        }
        
        int index = stones.length - 1;
        
        for (int i = 0; i < stones.length - 1; ++i) {
            Arrays.sort(stones);
            
            if (stones[index - 1] == 0)
                break;
                
            stones[index] -= stones[index - 1];
            stones[index - 1] = 0;
        }
        
        return stones[stones.length - 1];
        
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值