
个人主页:1白天的黑夜1-CSDN博客
专栏:力扣刷题录_1白天的黑夜1的博客-CSDN博客、企鹅程序员:Linux 系统与网络编程_1白天的黑夜1的博客-CSDN博客
目录
一、题目解析
1、选出两块最重的石头意为第一重和第二重或同样重
2、如果只剩一块石头,返回石头的重量;如果没有石头返回0
二、算法原理
解法:优先级队列
解法步骤:
三、代码示例
一、题目解析

1、选出两块最重的石头意为第一重和第二重或同样重
2、如果只剩一块石头,返回石头的重量;如果没有石头返回0
二、算法原理
解法:优先级队列
优先级队列就是堆,而堆又有大根堆和小根堆,本题需要用到的就是大根堆

这里模板参数Compare的缺省值为less,也就是按照从根往下,根比孩子大;而小根堆则是greater,从根往下,根比孩子小
解法步骤:
1、借助priority_queue的迭代器构造,用vector也就是存储石头重量的容器迭代器构造

2、循环碰石头(循环条件为大根堆的大小)
1、分别定义两个变量用于记录第一重和第二重石头的重量,赋初值为0
2、判断大根堆中是否还有元素,然后通过top取出石头重量赋值并pop
3、对于两块石头重量进行判断
1、相等,由题可知,两块石头粉碎,循环继续
2、不相等,重的石头减去轻的石头,然后push到大根堆中
4、退出循环条件判断
1、由于循环条件为大根堆的个数,所以0个时不会进入循环,无需判断
2、当只有1个时,会进入循环,重复2的操作,当取出石头后,此时个数为0,但根据3-2的判断逻辑,第二变量未赋值为0,所以此时又被push到大根堆中,如果不做处理会一直重复的,所以在最后判断当第二个变量为0时,代表此时只有一块石头,可以直接返回重量了
3、由于对只有1块石头的情况已处理,所以最后返回0即可
对于top、pop、push和迭代器初始化陌生的读者可以自行查询相关内容
链接:priority_queue - C++ Reference
三、代码示例
1class Solution { 2public: 3 int lastStoneWeight(vector<int>& stones) 4 { 5 priority_queue<int> pqi(stones.begin(),stones.end()); 6 while(pqi.size()) 7 { 8 int st1 = 0,st2 = 0; 9 if(pqi.size()) 10 { 11 st1 = pqi.top(); 12 pqi.pop(); 13 } 14 if(pqi.size()) 15 { 16 st2 = pqi.top(); 17 pqi.pop(); 18 } 19 if(st1 == st2) continue; 20 else 21 { 22 pqi.push(st1-st2); 23 } 24 if(st2 == 0) return st1; 25 } 26 return 0; 27 } 28};

