博客
关于我
LeetCode 1046. 最后一块石头的重量
阅读量:799 次
发布时间:2023-04-16

本文共 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。
  • 这种方法确保了每次操作都处理最重的石头,能够高效地解决问题。

    转载地址:http://udgfk.baihongyu.com/

    你可能感兴趣的文章
    Openresty框架入门详解
    查看>>
    OpenResty(1):openresty介绍
    查看>>
    OpenResty(2):OpenResty开发环境搭建
    查看>>
    OpenResty(3):OpenResty快速入门之安装lua
    查看>>
    OpenResty(4):OpenResty快速入门
    查看>>
    OpenResty(5):Openresty 模板渲染
    查看>>
    OpenSessionInView模式
    查看>>
    openshift搭建Istio企业级实战
    查看>>
    OpenSLL
    查看>>
    Openssh Openssl升级
    查看>>
    openssh 加固
    查看>>
    ViewPager切换滑动速度修改
    查看>>
    OpenSSL 引入了新的治理模式和项目,来增强社区参与和决策
    查看>>
    openssl内存分配,查看内存泄露
    查看>>
    OpenSSL创建SSL证书
    查看>>
    openssl在cygwin下编译错误:CPU不支持x86_64(CPU you selected does not support x86-64 instruction set )
    查看>>
    openssl安装
    查看>>
    openssl安装
    查看>>
    OpenSSL生成root CA及签发证书
    查看>>
    Openstack REST API
    查看>>