###### tags: `Leetcode` `easy` `heap` `python` `c++`
# 1046. Last Stone Weight
## [題目連結:] https://leetcode.com/problems/last-stone-weight/description/
## 題目:
You are given an array of integers ```stones``` where ```stones[i]``` is the weight of the ```ith``` stone.
We are playing a game with the stones. On each turn, we choose the h**eaviest two stones** and smash them together. Suppose the heaviest two stones have weights ```x``` and ```y``` with ```x <= y```. The result of this smash is:
* If ```x == y```, both stones are destroyed, and
* If ```x != y```, the stone of weight ```x``` is destroyed, and the stone of weight ```y``` has new weight ```y - x```.
At the end of the game, there is **at most one** stone left.
Return the weight of the last remaining stone. If there are no stones left, return ```0```.
## 解題想法:
* 題目為,給一數組,每次選出最大的兩數比較
* 若相等,皆刪除
* 否則,(大-小)放回數組
* 繼續比較
* 最終若數組還有剩,return剩的那個,否則return 0
* 使用heap裝取所有數
* 每次heappop()在將大於0的差值heappush即可
## Python:
* **heapq**: 為min_heap
``` python=
from heapq import heappush, heappop
class Solution(object):
def lastStoneWeight(self, stones):
"""
:type stones: List[int]
:rtype: int
"""
que=[]
#加上負號讓大的變最小可以先被heappop
for i in stones:
heappush(que,-i)
while len(que)>=2:
first=-heappop(que)
second=-heappop(que)
diff=first-second
if diff>0:
heappush(que,-diff)
return -que[0] if que else 0
```
## C++:
* include < queue > :
* **priority_queue** < int > 優先隊列:
* 為max_que: 大的會先被pop
``` cpp=
class Solution {
public:
int lastStoneWeight(vector<int>& stones) {
//#include<queue>
priority_queue<int> que;
for (auto val: stones)
que.push(val);
while (que.size()>=2){
int first=que.top(); que.pop();
int second=que.top(); que.pop();
if (first-second>0)
que.push(first-second);
}
return (!que.empty())? que.top() : 0;
}
};
```