class Solution {
   
    public int lastStoneWeight(int[] stones) {
        MaxHeap s=new MaxHeap(stones.length+1);
        for(int i=0;i<stones.length;i++)
        {
            s.insert(stones[i]);
        }
        while(s.size()>1)
        {
            int y=s.extractMax();
            int x=s.extractMax();
            if(y>x)
            {
                s.insert(y-x);
            }
        }
        if(s.size()==1)
        {
            return s.extractMax();
        }
        else
            return 0;
        
    }
}
class MaxHeap{
    private int[] stone;
    private int count;
    private int capacity;
    public MaxHeap(int capacity)
    {
        this.capacity=capacity;
        stone=new int[capacity+1];
        count=0;
    }
    public void insert(int n)
    {
        stone[++count]=n;
        shiftUp(count);
    }
    private void shiftUp(int count)
    {
        while(count>1&&stone[count/2]<stone[count])
        {
            swap(count/2,count);
            count=count/2;
        }
    }
    public void swap(int i,int j)
    {
        int temp=stone[i];
        stone[i]=stone[j];
        stone[j]=temp;
    }
    public int extractMax()
    {
        int res=stone[1];
        swap(1,count);
        count--;
        shiftDown(1);
        return res;
    }
    private void shiftDown(int i)
    {
      int j=2*i;
      while(j<=count)
      {
          if(j+1<=count&&stone[j+1]>stone[j])
          {
              if(stone[j+1]>stone[i])
              {
                   swap(j+1,i);
                   i=j+1;
                   j=2*i;
              }
              else
                  break;
             
          }
          else
          {
              if(stone[j]>stone[i])
              {
                  swap(j,i);
                  i=j;
                  j=2*i;
              }
              else
                  break;
          }
      }
    }  
    public int size()
    {
        return count;
    }
}

leetcode 1046的更多相关文章

  1. LeetCode 1046. 最后一块石头的重量(1046. Last Stone Weight) 50

    1046. 最后一块石头的重量 1046. Last Stone Weight 题目描述 每日一算法2019/6/22Day 50LeetCode1046. Last Stone Weight Jav ...

  2. LeetCode 1046. Last Stone Weight

    原题链接在这里:https://leetcode.com/problems/last-stone-weight/ 题目: We have a collection of rocks, each roc ...

  3. leetcode 57 Insert Interval & leetcode 1046 Last Stone Weight & leetcode 1047 Remove All Adjacent Duplicates in String & leetcode 56 Merge Interval

    lc57 Insert Interval 仔细分析题目,发现我们只需要处理那些与插入interval重叠的interval即可,换句话说,那些end早于插入start以及start晚于插入end的in ...

  4. LeetCode 1046. 最后一块石头的重量 (贪心)

    有一堆石头,每块石头的重量都是正整数. 每一回合,从中选出两块最重的石头,然后将它们一起粉碎.假设石头的重量分别为 x 和 y,且 x <= y.那么粉碎的可能结果如下: 如果 x == y,那 ...

  5. Leetcode题解 - 贪心算法部分简单题目代码+思路(860、944、1005、1029、1046、1217、1221)

    leetcode真的是一个学习阅读理解的好地方 860. 柠檬水找零 """ 因为用户支付的只会有5.10.20 对于10元的用户必须找一个5 对于20元的用户可以找(三 ...

  6. 【LeetCode】1046. Last Stone Weight 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 大根堆 日期 题目地址:https://leetco ...

  7. 【leetcode】1046. Last Stone Weight

    题目如下: We have a collection of rocks, each rock has a positive integer weight. Each turn, we choose t ...

  8. Swift LeetCode 目录 | Catalog

    请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift    说明:题目中含有$符号则为付费题目. 如 ...

  9. LeetCode.1046-最后的石头重量(Last Stone Weight)

    这是小川的第388次更新,第418篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第250题(顺位题号是1046).有一个石头集合,每个石头都有一个正整数重量值. 每次,我 ...

随机推荐

  1. oracle索引失效情况(转)

    1.隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误.   由于表的字段tu_mdn定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给Orac ...

  2. 使用ML.NET模型生成器来完成图片性别识别

    什么是ML.NET? ML.NET 使你能够在联机或脱机场景中将机器学习添加到 .NET 应用程序中. 借助此功能,可以使用应用程序的可用数据进行自动预测. 机器学习应用程序利用数据中的模式来进行预测 ...

  3. Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection

    目录 Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Generalized Focal L ...

  4. Luogu P4643 阿狸和桃子的游戏

    题解 传送门 既然题目要求的是差值 所以对于减数和被减数同时加上一个相同的数是毫无影响的 (详情参考人教版六年级上册数学教材) 所以不妨把边权分成两半 分别加给两个顶点 然后,直接每次选最大的点就好了 ...

  5. Java学习的第四十三天

    1.例5.1数组元素的引用 public class cjava { public static void main(String[] args) { int i; int []a=new int[1 ...

  6. AQS解析

    什么是AQS? AQS是JUC内存的基石,它本质上是一个抽象类,定义了多线程下资源争夺与释放的规则和过程,许多实现类都是继承于AQS,使用AQS的骨架. AQS的原理 AQS总体上来看是由一个FIFO ...

  7. CF715E—— Complete the Permutations

    传送门:QAQQAQ 题意:给你两个$1$~$n$的排列,0表示该位置数字不确定,两两交换第一个排列中的元素使之变成第二个排列,令$s[x]$表示对于所有不同的两个排列,最少交换次数为$x$的序列有$ ...

  8. CF295C Greg and Friends

    首先 我们考虑每次船来回运人时都可以看成一种dp状态 又因为人的体重只有50kg和100kg两种, 所以我们可以开一个三维数组dp[i][j][k],第1维表示在出发岸50kg有i个,第2维表示在出发 ...

  9. JS数组去重的9种方法(包括去重NaN和复杂数组类型)

    其实网上已经有很多js数组的去重方法,但是我看了很多篇并自己通过代码验证,发现都有一些缺陷,于是在研究多篇代码之后,自己总结了9种方法,如果有哪里不对请及时纠正我哈~ 转载请表明出处 测试代码 let ...

  10. HTML5+CSS3热门活动页面

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...