1046. 最后一块石头的重量

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 };

猜你喜欢

转载自www.cnblogs.com/NirobertEinteson/p/12002818.html