public class Solution
{
private PriorityQueue<int, int> pq;
public int LastStoneWeight(int[] stones)
{
pq = new PriorityQueue<int, int>(new MaxHeapComparer());
AddStones(stones);
ComputeLastStoneWeight();
return pq.Count == 0 ? 0 : pq.Dequeue();
}
private void AddStones(int[] stones)
{
foreach (var stone in stones)
{
pq.Enqueue(stone, stone);
}
}
private void ComputeLastStoneWeight()
{
while (pq.Count > 1)
{
var y = pq.Dequeue();
var x = pq.Dequeue();
if (x != y)
{
var diff = y - x;
pq.Enqueue(diff, diff);
}
}
}
public class MaxHeapComparer : IComparer<int>
{
public int Compare(int x, int y)
{
return y - x;
}
}
}