1046. 最后一块石头的重量 - 力扣(LeetCode)
目录
思路
1. 做一个最大堆
2. 从堆中取出最大的元素记为M,并重新调整堆
3. 用M减去调整后的堆中的新的最大元素,并将结果放入堆顶,再次调整堆
4. 循环执行2,3两步,直到整个堆中的石头完全被粉碎
代码
#define top 0
#define Vacancy 0
class Solution {
public:
int lastStoneWeight(vector<int>& stones) {
build_maxHeap(stones);
int M;
while (M = stones[top]) {
sink(stones, Vacancy, top);
if (!stones[top]) break;
sink(stones, M - stones[top], top);
}
return M;
}
void build_maxHeap(vector<int>& maxHeap) {
for (int pos = maxHeap.size() / 2 - 1; pos >= 0; --pos) {
sink(maxHeap, maxHeap[pos], pos);
}
}
void sink(vector<int>& stone, int pebble, int pos) {
int size = stone.size();
int bubble;
while ((bubble = pos * 2 + 1) <= size - 1) {
bubble != size - 1 && stone[bubble + 1] > stone[bubble] ? ++bubble : 0;
if (stone[bubble] <= pebble) break;
stone[pos] = stone[bubble];
pos = bubble;
}
stone[pos] = pebble;
}
};