1046. 最后一块石头的重量
有一堆石头,每块石头的重量都是正整数。
每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x
和 y
,且 x <= y
。那么粉碎的可能结果如下:
x == y
,那么两块石头都会被完全粉碎;x != y
,那么重量为 x
的石头将会完全粉碎,而重量为 y
的石头新重量为 y-x
。最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0
。
示例:
输入:[2,7,4,1,8,1] 输出:1 解释: 先选出 7 和 8,得到 1,所以数组转换为 [2,4,1,1,1], 再选出 2 和 4,得到 2,所以数组转换为 [2,1,1,1], 接着是 2 和 1,得到 1,所以数组转换为 [1,1,1], 最后选出 1 和 1,得到 0,最终数组转换为 [1],这就是最后剩下那块石头的重量。
提示:
1 <= stones.length <= 30
1 <= stones[i] <= 1000
原站题解
rust 解法, 执行用时: 0 ms, 内存消耗: 2 MB, 提交时间: 2023-11-17 16:47:41
use std::collections::BinaryHeap; impl Solution { pub fn last_stone_weight(stones: Vec<i32>) -> i32 { let mut h = BinaryHeap::from(stones); while h.len() > 1 { let d = h.pop().unwrap() - h.pop().unwrap(); h.push(d); } h.pop().unwrap() } }
python3 解法, 执行用时: 56 ms, 内存消耗: 16.1 MB, 提交时间: 2023-11-17 16:46:11
class Solution: def lastStoneWeight(self, stones: List[int]) -> int: # 初始化 heap = [-stone for stone in stones] heapq.heapify(heap) # 模拟 while len(heap) > 1: x,y = heapq.heappop(heap),heapq.heappop(heap) if x != y: heapq.heappush(heap,x-y) if heap: return -heap[0] return 0
javascript 解法, 执行用时: 92 ms, 内存消耗: 42.6 MB, 提交时间: 2023-11-17 16:45:46
/** * @param {number[]} stones * @return {number} */ var lastStoneWeight = function(stones) { const pq = new MaxPriorityQueue(); for (const stone of stones) { pq.enqueue('x', stone); } while (pq.size() > 1) { const a = pq.dequeue()['priority']; const b = pq.dequeue()['priority']; if (a > b) { pq.enqueue('x', a - b); } } return pq.isEmpty() ? 0 : pq.dequeue()['priority']; };
golang 解法, 执行用时: 0 ms, 内存消耗: 1.9 MB, 提交时间: 2023-11-17 16:45:13
type hp struct{ sort.IntSlice } func (h hp) Less(i, j int) bool { return h.IntSlice[i] > h.IntSlice[j] } func (h *hp) Push(v interface{}) { h.IntSlice = append(h.IntSlice, v.(int)) } func (h *hp) Pop() interface{} { a := h.IntSlice; v := a[len(a)-1]; h.IntSlice = a[:len(a)-1]; return v } func (h *hp) push(v int) { heap.Push(h, v) } func (h *hp) pop() int { return heap.Pop(h).(int) } func lastStoneWeight(stones []int) int { q := &hp{stones} heap.Init(q) for q.Len() > 1 { x, y := q.pop(), q.pop() if x > y { q.push(x - y) } } if q.Len() > 0 { return q.IntSlice[0] } return 0 }
java 解法, 执行用时: 1 ms, 内存消耗: 39.3 MB, 提交时间: 2023-11-17 16:44:54
class Solution { public int lastStoneWeight(int[] stones) { PriorityQueue<Integer> pq = new PriorityQueue<Integer>((a, b) -> b - a); for (int stone : stones) { pq.offer(stone); } while (pq.size() > 1) { int a = pq.poll(); int b = pq.poll(); if (a > b) { pq.offer(a - b); } } return pq.isEmpty() ? 0 : pq.poll(); } }
cpp 解法, 执行用时: 0 ms, 内存消耗: 7.8 MB, 提交时间: 2023-11-17 16:44:33
class Solution { public: int lastStoneWeight(vector<int>& stones) { priority_queue<int> q; for (int s: stones) { q.push(s); } while (q.size() > 1) { int a = q.top(); q.pop(); int b = q.top(); q.pop(); if (a > b) { q.push(a - b); } } return q.empty() ? 0 : q.top(); } };
python3 解法, 执行用时: 40 ms, 内存消耗: 14.7 MB, 提交时间: 2022-07-21 10:18:51
class Solution: def lastStoneWeight(self, stones: List[int]) -> int: x, y = 0, 0 while len(stones) > 1: x = max(stones) stones.remove(x) y = max(stones) stones.remove(y) if x != y: stones.append(x-y) return stones[0] if len(stones) == 1 else 0
golang 解法, 执行用时: 0 ms, 内存消耗: 2 MB, 提交时间: 2021-06-10 22:17:07
func lastStoneWeight(stones []int) int { n := len(stones) if n == 1 { return stones[0] } sort.Ints(stones) for n >= 2 && stones[n-2] != 0 { stones = append(stones[0:n-2], stones[n-1] - stones[n-2]) sort.Ints(stones) n-- } return stones[n-1] }