#1046
Easy Algorithms Last stone weight
Array Heap (Priority Queue)
66.3% acceptance
Feb 25, 2026
6623
154
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 heaviest 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.
Solution
Rust
Time O(n log n)
Space O(1)
impl Solution {
pub fn last_stone_weight(stones: Vec<i32>) -> i32 {
use std::collections::BinaryHeap;
let mut heap: BinaryHeap<i32> = stones.into_iter().collect();
while heap.len() > 1 {
let y = heap.pop().unwrap();
let x = heap.pop().unwrap();
if x != y { heap.push(y - x); }
}
heap.pop().unwrap_or(0)
}
}