本文共 1096 字,大约阅读时间需要 3 分钟。
为了解决这个问题,我们需要找到一种高效的方法来处理石头的粉碎过程。每次操作选择两块最重的石头粉碎,直到只剩下一块石头或没有石头为止。
我们可以使用优先队列(堆)来实现这一过程。优先队列可以帮助我们高效地获取当前最重的石头。具体步骤如下:
这种方法的时间复杂度是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;}
priority_queue默认是最小堆,所以我们直接使用它,或者可以将值取负数来模拟最大堆。这种方法确保了每次操作都处理最重的石头,能够高效地解决问题。
转载地址:http://udgfk.baihongyu.com/