最后一块石头的重量及优先队列讲解

news/2024/11/19 19:37:27/

题目

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

每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 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],这就是最后剩下那块石头的重量。

最大堆方法解题:

class Solution {public int lastStoneWeight(int[] stones) {PriorityQueue<Integer> pq = new PriorityQueue<Integer>((a, b) -> b - a);for (int stone : stones) {pq.offer(stone);}while (pq.size() > 1) {int a = pq.poll();int b = pq.poll();if (a > b) {pq.offer(a - b);}}return pq.isEmpty() ? 0 : pq.poll();}
}

优先队列:

PriorityQueue<Integer> p = new PriorityQueue<>();

优先级队列从队头取元素,从队尾添加元素。默认情况下,队列中的数据是升序排序。

PriorityQueue<Integer> p = new PriorityQueue<>();
p.offer(5);
p.offer(1);
p.offer(3);while(!p.isEmpty()) {System.out.println(p.poll());  //依次打印:1 3 5
}

方法

和队列的方法基本一样

方法 作用
add(E e)将指定元素插入此优先级队列
clear()移除队列中所有元素
comparator()返回用来对此队列中的元素进行排序的比较器;如果此队列根据其元素的自然顺序进行排序,则返回null
contains(Object o)如果此队列包含指定的元素,则返回true
Iterator()返回在此队列中的元素上进行迭代的迭代器
offer(E e)将指定的元素插入此优先级队列
peek()获取但不移除此队列的头:如果此队列为空,则返回null
poll()获取并移除此队列的头,如果此队列为空,则返回null
remove(Object o)从此队列中移除指定元素的单个实例(如果存在)。
size()返回此队列中的元素数,
toArray()返回一个包含此队列所有元紊的数组。
toArray(T[] a)返回一个包含此队列所有元素的数组;返回数组的运行时类型是指定数组的类型。

自定义排序规则

以下代码改变排序规则,从大到小:

PriorityQueue<Integer> queue=new PriorityQueue<>((o1,o2)->o2-o1);
PriorityQueue<Integer> queue= new PriorityQueue<>(Comparator.reverseOrder());

根据HashMap的value值对HashMap的键值对排序

public static void main(String[] args) {HashMap<Integer, Integer> map = new HashMap<>();map.put(1, 2);map.put(3, 4);map.put(5, 6);Set<Map.Entry<Integer, Integer>> entries = map.entrySet();//获取键值对//自定义优先队列的排序规则,队列内存放的数据类型是键值对//o1,o2都是键值对这样的对象PriorityQueue<Map.Entry<Integer, Integer>> queue = new PriorityQueue<>((o1, o2) -> {return o1.getValue() - o2.getValue();//根据值升序排序});for (Map.Entry<Integer, Integer> entry : entries) {queue.offer(entry);//将键值对放到优先队列中}while(!queue.isEmpty()) {System.out.println(queue.poll().getValue());}
}

http://www.ppmy.cn/news/1158446.html

相关文章

MySQL学习(三)——多表连接查询

文章目录 1. 多表关系1.1 一对多1.2 多对多1.3 一对一 2. 概述2.1 数据准备2.2 简单查询2.3 分类 3. 内连接4. 外连接5. 自连接5.1 自连接查询5.2 联合查询 6. 子查询6.1 概念6.2 标量子查询6.3 列子查询6.4 行子查询6.5 表子查询 1. 多表关系 项目开发中&#xff0c;在进行数…

python批量将多年降水的nc数据处理为季节性平均降水量或年降水量

本代码目的: 1.批量读取nc降水数据集。 2.按照季节平均来粗略绘制降水量图。 3.保存所有处理后的数据集,以备下次精细化绘图。 原始数据请见美国2013-2021年每日降水的nc数据集资源-CSDN文库 ##1.导入需要的库和函数 import xarray as xr import os from netCDF4 impo…

微信小程序--小程序框架

目录 前言&#xff1a; 一.框架基本介绍 1.整体结构&#xff1a; 2.页面结构&#xff1a; 3.生命周期&#xff1a; 4.事件系统&#xff1a; 5.数据绑定&#xff1a; 6.组件系统&#xff1a; 7.API&#xff1a; 8.路由&#xff1a; 9.模块化&#xff1a; 10.全局配置&…

Typora+PicGo+Github+CSDN梦幻联动

文章目录 一、快速搭建个人免费图床二、Typora图片实现自动上传三、Typora图片上传到CSDN出现错误 一、快速搭建个人免费图床 之前写过一篇 快速搭建个人免费图床 的文章&#xff0c;但是每次都要把图片拖到PicGo里面才能生成链接很麻烦&#xff0c;而且在本地用Typora写的文章…

MBR10200CT-ASEMI肖特基MBR10200CT参数、规格、尺寸

编辑&#xff1a;ll MBR10200CT-ASEMI肖特基MBR10200CT参数、规格、尺寸 型号&#xff1a;MBR10200CT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220 恢复时间&#xff1a;&#xff1e;50ns 正向电流&#xff1a;10A 反向耐压&#xff1a;200V 芯片个数&#xff1a;2 …

python每日一练(8)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

如何选择超声波清洗机、超声波清洗机排行榜

眼镜的日常清洗生活中很多人都会把它给忘记&#xff01;长时间下来眼镜支架就会变成黄色的&#xff0c;非常的难洗掉&#xff0c;从而又浪费了一个眼镜。一副好的眼镜也不便宜的&#xff0c;把换眼镜的钱省下来入一款超声波清洗机&#xff0c;可以大大的减少金钱的支持&#xf…

大数据Flink(九十七):EXPLAIN、USE和SHOW 子句

文章目录 EXPLAIN、USE和SHOW 子句 一、EXPLAIN 子句 二、USE 子句