文章目錄
- 題目鏈接:
- 題目描述:
- 解法
- 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;}
};