letcode每日一题-最后一块石头的重量

临近年底,工作增多了,少了好几天的,元旦补一下吧,先记录一下今天的:

首先看到选出两块最重的石头,这种排前几的问题,使用堆排序是最好的,所以这里我们只需要每次用堆排序排除前两大 的石头,如果体积

相等就跳过,如果不相等就把剩余的继续放入数组中即可,代码 实现如下:

public int lastStoneWeight(int[] stones) {
        if(stones.length==1){
            return stones[0];
        }
        int live=0;
        for (int i=0;i<stones.length-1;i++){
            for(int j=0;j<2;j++){
                heap_down(stones,stones.length-j-i);
                swap(stones,0,stones.length-j-1-i);
            }
            live=Math.abs(stones[stones.length-1-i]-stones[stones.length-2-i]);
            if(live==0){
                if(++i==(stones.length-2)){
                    return Math.abs(live-stones[0]);
                }
            }else{
                stones[stones.length-i-2]=live;
            }
        }
        return live;
    }

    /**
     * 构造大顶堆
     * @param datas
     */
    public static void heap_down(int[] datas,int size){
        for(int end=size-1;end>0;end-=2){
            int index=end;
            if(datas[end]<datas[end-1]){
                index=end-1;
            }
            int parentIndex=(end-2)/2;
            if(datas[parentIndex]<datas[index]){
                swap(datas,index,parentIndex);
            }
        }
    }

    public static void swap(int[] datas,int p1,int p2){
        int temp=datas[p1];
        datas[p1]=datas[p2];
        datas[p2]=temp;
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值