文章目录
- 题目链接:
- 题目描述:
- 解法
- C++ 算法代码:
题目链接:
1046. 最后一块石头的重量
题目描述:
解法
每次取出最重的两块石头进行碰撞,将剩余的石头重新放入堆中。
C++ 算法代码:
class Solution
{
public:int lastStoneWeight(vector<int>& stones) {// 最后一块石头的重量问题// 基本思路:使用大根堆模拟石头碰撞的过程// 1. 创建一个大根堆(优先队列)// C++中priority_queue默认是大根堆,元素按从大到小排序priority_queue<int> heap;// 2. 将所有石头的重量放入堆中// 这样可以自动按重量从大到小排序for(auto x : stones) heap.push(x);// 3. 模拟石头碰撞的过程// 每次取出最重的两块石头进行碰撞while(heap.size() > 1) // 当堆中至少有两块石头时继续{// 取出最重的石头aint a = heap.top(); heap.pop();// 取出第二重的石头bint b = heap.top(); heap.pop();// 如果a比b重,则a会剩下(a-b)的重量// 将剩余的石头重新放入堆中if(a > b) heap.push(a - b);// 如果a等于b,两块石头都会粉碎,不需要额外操作}// 4. 返回最后的结果// 如果堆不为空,返回最后一块石头的重量// 如果堆为空,说明所有石头都粉碎了,返回0return heap.size() ? heap.top() : 0;}
};