Last Stone Weight - Leetcode

We have a collection of stones, each stone has a positive integer weight.
Each turn, we choose the two heaviest stones and smash them together.  Suppose the stones have weights x and y with x <= y.  The result of this smash is:
  • If x == y, both stones are totally destroyed;
  • If x != y, the stone of weight x is totally destroyed, and the stone of weight y has new weight y-x.
At the end, there is at most 1 stone left.  Return the weight of this stone (or 0 if there are no stones left.)

Example 1:
Input: [2,7,4,1,8,1]
Output: 1
Explanation: 
We combine 7 and 8 to get 1 so the array converts to [2,4,1,1,1] then,
we combine 2 and 4 to get 2 so the array converts to [2,1,1,1] then,
we combine 2 and 1 to get 1 so the array converts to [1,1,1] then,
we combine 1 and 1 to get 0 so the array converts to [1] then that's the value 
of last stone.

Note:
  1. 1 <= stones.length <= 30
  2. 1 <= stones[i] <= 1000
class Solution {
    public int lastStoneWeight(int[] stones) {
       
        PriorityQueue<Integer> queue = new PriorityQueue<Integer>(Comparator.reverseOrder());
        for (int stone : stones) { queue.offer(stone); }
        while (queue.size() > 1) {
            queue.offer(queue.poll() - queue.poll());
        }
        return queue.peek();
       
    }
}


Try this on Leetcode

Here Priority Queue is the best solution.
Comparator.reverseOrder() is used to reverse the queue in reverse of natural order(i.e., descending order). Reversing is done to find difference between first max and second max elements.
offer() - add element into queue.
peek() - retrieves top element in queue
poll() - retrieves and removes element from front of queue container

If anyone had different solution leave it as a comment

Comments

Popular posts from this blog

Balanced Binary Tree

First Unique Character in a String

Majority Element

Smallest Range II