leetcode 1046 Last Stone Weight

最后一块石头的重量

题意:

我们有一个岩石集合,每个岩石都有一个正整数权重。
每转一圈,我们选择两个最重的 岩石并将它们粉碎在一起。假设石头有重量x并且y与x <= y。粉碎的结果是:
如果x == y,则两块石头都被完全摧毁;
如果x != y,重量的石头x被完全破坏了,重量的石头y有了新的重量y-x。
最后,最多剩下1块石头。返回此石头的重量(如果没有石头,则返回0。)
范例1:
输入: [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],这就是最后一块石头的值。

解题思路:

贪心法每次都选择重量较小的两块石头进行粉碎
加入一个大根堆 每次弹出2个数 如果不相等 就粉碎 相等 合并为0 最后堆中只留下一个数

代码解析:

定义比较器

 public class  MyCompartor implements Comparator<Integer>{
        @Override
        public int compare(Integer o1, Integer o2) {
            return o2-o1;
        }
    }
/**
     * 解题思路 ;加入一个大根堆 每次弹出2个数 如果不相等 就粉碎 相等 合并为0 最后堆中只留下一个数
     * Runtime: 1 ms, faster than 96.17% of Java online submissions for Last Stone Weight.
     * Memory Usage: 34.2 MB, less than 100.00% of Java online submissions for Last Stone Weight.
     * Next challenges:
     * @param stones
     * @return
     */
    public int lastStoneWeight(int[] stones) {
        if (stones.length==0 || stones==null) return 0;
        int len = stones.length;
        PriorityQueue<Integer> queue=new PriorityQueue<>(new MyCompartor());
        for (int i = 0; i < len; i++) {
            queue.add(stones[i]);
        }
        while (queue.size()!=1){
            Integer a = queue.poll();
            Integer b = queue.poll();
            if (a==b){
                queue.add(0);
            }else if (a<b){
                queue.add(b-a);
            }else {
                queue.add(a-b);
            }
        }
        return queue.poll();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值