难度:简单
题目:
有一堆石头,每块石头的重量都是正整数。
每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 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],这就是最后剩下那块石头的重量。
提示:
- 1 <= stones.length <= 30
- 1 <= stones[i] <= 1000
Related Topics
- 数组
- 堆(优先队列)
重点!!!解题思路
第一步:
明确解题手段:只要是求集合最值问题,我们都可以采用堆(优先队列)来解决
由题意可知,每次我们需要选出最重的石头,所以我们需要一个大顶堆
第二步:
我们将给定的所有石头加入堆中,再进行判断
因为我们最后只需要一个石头重量
所以当堆剩的最后的一个元素我们将其返回
每次我们在堆中弹出两个最大的石头来进行比较,
如果相等则不操作,如果不相等则将差值加入堆中。
第三步:
最后堆中可能为空,或剩余一个元素
如果为空返回重量为0,如果不为空则直接将剩余元素返回
源码:
class Solution {
public int lastStoneWeight(int[] stones) {
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(new Comparator<Integer>({
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
for (int i:stones){
priorityQueue.offer(i);
}
while (priorityQueue.size()>1){
Integer x = priorityQueue.poll();
Integer y = priorityQueue.poll();
if (x>y){
priorityQueue.offer(x-y);
}
}
return priorityQueue.isEmpty() ? 0:priorityQueue.poll();
}
}
解题结果:
如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。
系列持续更新中,点个订阅吧