1046. 最后一块石头的重量
描述:
有一堆石头,每块石头的重量都是正整数。
每一回合,从中选出两块最重的石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:
如果 x == y,那么两块石头都会被完全粉碎;
如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。
最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。
提示:
1 <= stones.length <= 30
1 <= stones[i] <= 1000
1 解法: 0 ms 8.5 MB 2 class Solution { 3 public: 4 int result(priority_queue<int> &q){ 5 int newStone=0; 6 while(q.size()>=2){//最后剩余 1,或者0个 7 int x=0,y=0; 8 for(int i=0;i<2;i++){//x一定大于等于 y 9 if(i==0){//取出两个最大的石头 10 x=q.top(),q.pop(); 11 }else{ 12 y=q.top(),q.pop(); 13 } 14 // i==0?x=q.top(),q.pop():y=q.top(),q.pop(); 15 } 16 if(x!=y){//石头重量均为正整数 17 newStone=x-y; 18 q.push(newStone);//将新的石头重量 放入优先队列中 19 } 20 } 21 if(q.size()==1) return q.top();//有一个剩余 22 else return 0;//没有是同剩余 23 } 24 int lastStoneWeight(vector<int>& stones) { 25 /* 26 思路: 27 1:先将数据放入优先队列中,从大到小排序 28 2: 只要优先队列中的大小>=2 ,那么取出两个最大重量的石头 29 3:若两块石头重量相等,粉碎这两块石头,pop() 30 4:若不相等,算出两块石头的差(正整数) 放入优先队列中 31 5:直到优先队列的长度为1,或者为0,返回结果; 32 6:长度为1,返回这个石头的重量 33 7:长度为0,返回0 34 */ 35 priority_queue<int> q;//优先队列,默认从大到小排序 36 for(int data:stones){ 37 q.push(data); 38 } 39 return result(q); 40 } 41 };