列表

详情


1046. 最后一块石头的重量

有一堆石头,每块石头的重量都是正整数。

每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:

最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 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],这就是最后剩下那块石头的重量。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int lastStoneWeight(vector<int>& stones) { } };

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]
}

上一题