最后一块石头的重量
题目
有一堆石头,每块石头的重量都是正整数。
每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:
如果 x == y,那么两块石头都会被完全粉碎;如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。
复制代码
题解
思路与算法:
因为每一回合都要选出最重的两块石头,我们自然而然地想到堆这个可以自动实现排序的数据结构。
将所有的石头放入到大顶堆中,然后依次取出最重的两块石头 x 和 y,必有 x ≥ y。如果 x > y,则将新石头 x - y 放回到最大堆中;
如果 x = y,两块石头完全被粉碎,因此不会产生新的石头。重复上述操作知道剩下的石头少于 2 块。
最终可能剩下 1 块石头,该石头的重量即为最大堆中剩下的元素,返回该元素;也可能没有石头剩下,此时最大堆为空,返回 0。
JS 实现:
复制代码
总结
为了弥补 JS 内置数据结构的缺失。除了 JS 内置数据结构之外,LeetCode 平台还对 JS 提供了两种额外的数据结构,它们分别是:
queue
priority-queue
这两个数据结构都使用的是第三方 datastructures-js 实现的版本
除了普通队列,LeetCode 还提供了一种特殊的队列 - 优先队列。
复制代码
版权声明: 本文为 InfoQ 作者【掘金安东尼】的原创文章。
原文链接:【http://xie.infoq.cn/article/fcae997270d3a1b3ee4a05c65】。文章转载请联系作者。
评论