LeetCode1046 最后一块石头的重量(贪心—Java优先队列简单应用)

题目:

有一堆石头,每块石头的重量都是正整数。

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

如果 x == y,那么两块石头都会被完全粉碎;
如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。
最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。

提示:

1 <= stones.length <= 30
1 <= stones[i] <= 1000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/last-stone-weight

思路:

利用优先队列,每次弹出数组中最大的两个数字,然后用大数减去小数,结果放回优先队列,直到优先队列中只剩下一个元素为止,这个元素的值就是最终的结果。

代码:

import java.util.*;
import java.math.*;

class Solution {
    static Comparator<Integer> cmp = new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return o2-o1;
        }
    };
    public int lastStoneWeight(int[] stones) {
        Queue<Integer> queue = new PriorityQueue<>(cmp);
        for(int i=0; i<stones.length; i++){
            queue.add(stones[i]);
        }
        while(queue.size() > 1){
            int a = queue.poll();
            int b = queue.poll();
            //System.out.println(a+" "+b);
            queue.add(Math.max(a,b) - Math.min(a,b));
        }
        return queue.poll();
    }
}

public class Main {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        Solution solution = new Solution();
        int n = scanner.nextInt();
        int[] chips = new int[n];
        for(int i=0; i<n; i++){
            chips[i] = scanner.nextInt();
        }
        System.out.println(solution.lastStoneWeight(chips));
    }
}

感谢博友的博客内容,参考Java优先队列的应用:

https://www.cnblogs.com/wei-jing/p/10806236.html

原文地址:https://www.cnblogs.com/sykline/p/12234768.html

时间: 2024-08-03 11:34:48

LeetCode1046 最后一块石头的重量(贪心—Java优先队列简单应用)的相关文章

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

题目标签:Greedy 利用priority queue, 把石头重量都存入 pq, 每次取最大两个比较,存入差值,直到pq 只剩最后一个. Java Solution: Runtime:  1 ms, faster than 92.5% Memory Usage: 37.1 MB, less than 100% 完成日期:02/14/2020 关键点:priority queue class Solution { public int lastStoneWeight(int[] stones)

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

leetcode真的是一个学习阅读理解的好地方 860. 柠檬水找零 """ 因为用户支付的只会有5.10.20 对于10元的用户必须找一个5 对于20元的用户可以找(三个5)或者(一个10一个5),每次都从大的开始找起来 """ class Solution: def lemonadeChange(self, bills) -> bool: five = 0 ten = 0 for i in bills: if i == 5: five

一块石头

作者: 刘亮程 突然想起我送你的那块石头了.它还好吗?你是否带着它回了家.你已经没有家了,四处漂泊的你,又能将一块石头带到了哪里.我说过,它很沉的.那是块孤独透顶的石头,你别企图感化它,我相信你的爱和热情,但它不会比一块石头坚持的更久. 之所以送给你,是因为你的生日,也因为那天我喝多了,想到自己,最终无力让我喜欢的石头,真正出土. 我发现了它,就像它发现了我. 仅仅是一个人和一块石头的默默相遇.在那荒凉的乱石滩上,那样巨大而空虚的一个黄昏,头顶滚滚沙尘的我,用什么擦拭了一块石头的百年蒙尘. 把它

java htmlparser 简单使用入门

请尊重本人的工作成果,转载请留言,并说明转载地址,谢谢.地址如下: http://blog.csdn.net/fukainankai/article/details/27710883 前几节中,我们利用GDI+在窗口中绘制了各种各样的图形.图像,这一节,我们将会将这些图像保存成简单图像.所谓简单图像,指的是bmp/jpg/png等图像或者单帧的gif图像.保存成多帧的gif图像稍微复杂一点,本节中暂时不做说明.保存成动态的tiff文件也比较简单,但这里也不做说明,下次有机会和gif一起介绍. 另

SOJ4459 skysky&#39;s game(贪心、优先队列)

天天最近迷上了天天爱消除游戏,现在他觉得这个游戏已经没有意思了.所以他发明一个新的消除游戏.有n堆糖果,每一个糖果有一个重量w,天天每次都选择两个糖果合并为一个糖果,新的糖果的重量等于这两个糖果的重量之和,并且他将获得等价于这两个糖果重量的值.直到只剩下一个糖果为止.现在天天想知道他最后最少获得的值是多少? Input 第一行包含一个整数t(t<=10),代表组数 对于每一组数据,首先是一个整数n(n<=100000),代表有n堆糖果.接下来有n个数wi(0<=wi<=100000

使用java搭建简单的ligerui环境

最近因为工作需要,学习了ligerui框架.但是,因为在公司,我们只是作为最低层的码农,所以环境都已经搭建好了,我们这些码农平时都是直接拿到工程,然后在别人的框架上不断的ctrl + c.ctrl + v,然后修修补补.所以为了摆脱这种困境,决定自己使用简单的servlet搭建一个ligerui,然后测试下ligerui这玩意到底是怎么跑起来的. 1.下载ligerui相关组件.这个很简单,直接去www.ligerui.com即可找到. 2.使用Eclipse创建一个web工程,然后搭建下面这个

Java数据类型简单总结

Java数据类型简单总结 一:Java数据类型总的分为两大类:基本数据类型和引用数据类型. 基本数据类型:byte.short.int.long.float.double.char.boolean八种. 引用数据类型: 1:除了基本数据类型之外都是引用数据类型, 2:API类:String.File 3:自定义类:Test01...... 4:数组:int [ ].String [ ] 二:基本数据类型 1:分类 数据类型 位(bit) 取值范围 数据类型 位 取值范围 byte 8 -128~

Java对象简单实用(计算器案例)

Java对象简单实用(计算器案例) 对 Java中的对象与属性,方法的使用,简单写了个案例 1 import java.util.Scanner; 2 class Calculste 3 { 4 int a; //定义两个整数 5 int b; 6 String option; //定义接收操作符的字符串 7 public void count(){ 8 9 //对操作符进行判断 10 switch(option){ 11 case "+": 12 System.out.println

Java实现简单版SVM

最近的图像分类工作要用到latent svm,为了更加深入了解svm,自己动手实现一个简单版的. 之所以说是简单版,因为没有用到拉格朗日,对偶,核函数等等.而是用最简单的梯度下降法求解.其中的数学原理我参考了http://blog.csdn.net/lifeitengup/article/details/10951655,文中是用matlab实现的svm. 源代码和数据集下载:https://github.com/linger2012/simpleSvm 其中数据集来自于libsvm,我找了其中