官方题解
var lastStoneWeight = function(stones) {
const pq = new MaxPriorityQueue();
for (const stone of stones) {
pq.enqueue('x', stone);
}
while (pq.size() > 1) {
const a = pq.dequeue()['priority'];
const b = pq.dequeue()['priority'];
if (a > b) {
pq.enqueue('x', a - b);
}
}
return pq.isEmpty() ? 0 : pq.dequeue()['priority'];
};
代码解释:
第一次见这种构造函数,记录一下
实现了一个函数lastStoneWeight。该函数接受一个整数数组stones作为参数。
首先,代码创建了一个最大优先队列pq,用于存储石头的重量。然后,通过遍历stones数组,将每个石头的重量加入到优先队列中,其中使用'x'作为元素的标识符。
接下来,使用一个循环来处理优先队列中的元素。在每次循环中,从队列中取出两个元素,分别表示两块石头的重量。如果第一个石头的重量大于第二个石头的重量,则将两块石头的重量差(即a - b)加入到优先队列中。
最后,判断优先队列是否为空。如果为空,说明没有剩余的石头,返回0;否则,从队列中取出最后一块剩余石头的重量,并将其作为结果返回。
整体上,这段代码的作用是模拟撞击石头的过程,每次选取最重的两块石头进行撞击,直到最后只剩下一块石头,返回其重量。
MaxPriorityQueue
MaxPriorityQueue是JavaScript中的一个自定义最大优先队列类。优先队列是一种特殊的数据结构,其中的元素按照优先级进行排序,并且每次从队列中取出的元素都是具有最高优先级的元素。
在JavaScript中,并没有内置的最大优先队列实现,但我们可以使用其他数据结构来模拟它。在这段代码中,MaxPriorityQueue被实现为一个类,它具有以下方法:
enqueue(priority, element): 向队列中添加一个元素,并指定其优先级。较高优先级的元素会排在队列的前面。dequeue(): 从队列中移除并返回具有最高优先级的元素。size(): 返回队列中元素的数量。isEmpty(): 检查队列是否为空。
在这段代码中,最大优先队列通过使用一个数组来存储元素,并根据其优先级进行排序。每个元素都是一个对象,包含两个属性:priority表示优先级,element表示实际的元素值。通过使用enqueue方法向队列中添加元素时,会根据优先级将元素正确地插入到数组中的合适位置。通过使用dequeue方法,可以移除并返回具有最高优先级的元素。
值得注意的是,这段代码中的优先队列使用了一个固定的优先级标识符'x',而不是根据实际元素的属性进行排序。这是因为在具体应用中,元素的优先级可能是由其自身的某个属性决定的,例如石头的重量。但是这段代码只关注石头的重量差值,因此使用了一个固定的标识符来代表每个元素的优先级。