题目
有一堆石头,每块石头的重量都是正整数。
每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x
和 y
,且 x <= y
。那么粉碎的可能结果如下:
- 如果
x == y
,那么两块石头都会被完全粉碎; - 如果
x != y
,那么重量为x
的石头将会完全粉碎,而重量为y
的石头新重量为y-x
。
最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0
。
Example 1:
1 | 输入:[2,7,4,1,8,1] |
提示:
1 <= stones.length <= 30
1 <= stones[i] <= 1000
解法
解法一:
大顶堆
构造一个大顶堆,每次从该堆中取出两个元素,比较,如果不相同则求出它们的差,重新插入大顶堆。需要注意的是:
- Java中堆默认是小顶堆,大顶堆需要在初始化的时候传入自定义Comparator;
- 当堆中最后只剩两个相同元素的时候,返回0
- 可以采用lambda表达式初始化大顶堆PriorityQueue
pq = new PriorityQueue<>((a, b) -> b - a) - 也可以用集合的Collections.reverseOrder()方法初始化大顶堆PriorityQueue
pq = new PriorityQueue<>(Collections.reverseOrder())
JAVA
1 | public int lastStoneWeight(int[] stones) { |