1046 Last Stone Weight
Solved at: 2022-08-30
Question
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 weightxis destroyed, and the stone of weightyhas new weighty - 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
class Solution:
def lastStoneWeight(self, stones: List[int]) -> int:
while(len(stones) > 1):
greatest = max(stones)
stones.remove(greatest)
second = max(stones)
stones.remove(second)
if greatest - second > 0:
stones.append(greatest - second)
if stones:
return stones[0]
return 0
- Time:
- Space:
Improved
class Solution:
def lastStoneWeight(self, stones: List[int]) -> int:
for idx, val in enumerate(stones):
stones[idx] = -1 * val
heapq.heapify(stones)
while(len(stones) > 1):
first = heapq.heappop(stones)
second = heapq.heappop(stones)
if first - second < 0:
heapq.heappush(stones, first - second)
return -1 * heapq.heappop(stones) if len(stones) else 0
heapq.heapify()is .- Time: .
- Space: in Python
Results
Runtime
75 ms, faster than 5.53% of Python3 online submissions for Last Stone Weight.
Memory Usage
14 MB, less than 14.37% of Python3 online submissions for Last Stone Weight.