LeetCode 1046. 最后一块石头的重量
发布日期:2025-06-19 11:55:26 浏览次数:4 分类:精选文章

本文共 1096 字,大约阅读时间需要 3 分钟。

为了解决这个问题,我们需要找到一种高效的方法来处理石头的粉碎过程。每次操作选择两块最重的石头粉碎,直到只剩下一块石头或没有石头为止。

方法思路

我们可以使用优先队列(堆)来实现这一过程。优先队列可以帮助我们高效地获取当前最重的石头。具体步骤如下:

  • 初始化优先队列:将所有石头的重量放入一个最大堆中。
  • 处理石头:每次从堆中取出两块最重的石头。如果它们的重量相等,它们都会被粉碎,返回0。如果不相等,较重的石头会减少到两者之差,并将结果放回堆中。
  • 循环处理:重复上述过程,直到堆中只剩下一块石头或没有石头为止。
  • 这种方法的时间复杂度是O(n log n),其中n是石头的数量。每次操作的时间复杂度为O(log n),因为堆的插入和提取操作都是 logarithmic 时间复杂度。

    解决代码

    #include 
    #include
    using namespace std;int lastStoneWeight(vector
    &stones) { priority_queue
    q; for (int stone : stones) { q.push(stone); } while (q.size() >= 2) { int st1 = q.top(); q.pop(); int st2 = q.top(); q.pop(); int result; if (st1 == st2) { result = 0; } else { result = st1 - st2; } q.push(result); } return q.size() > 0 ? q.top() : 0;}

    代码解释

  • 初始化优先队列:我们使用一个最大堆来存储石头的重量。由于C++的priority_queue默认是最小堆,所以我们直接使用它,或者可以将值取负数来模拟最大堆。
  • 处理石头:在循环中,每次取出两个最重的石头。如果它们的重量相等,返回0,表示所有石头都被粉碎。如果不相等,计算它们的差值,并将差值放回堆中。
  • 循环处理:继续处理直到堆中只剩下一块石头或没有石头为止。最后,检查堆中是否有石头,返回堆顶的值或0。
  • 这种方法确保了每次操作都处理最重的石头,能够高效地解决问题。

    上一篇:LeetCode 121. 买卖股票的最佳时机
    下一篇:LeetCode 1122. 数组的相对排序

    发表评论

    最新留言

    逛到本站,mark一下
    [***.202.152.39]2026年06月21日 16时27分07秒