每日一题——LeetCode1046.最后一块石头的重量

文章介绍了两种解决LeetCode中最大石头重量问题的方法:暴力排序与利用最大堆的优先队列。暴力排序时间复杂度高,而官方解法借助堆结构更高效。文中详细展示了两种算法的实现和内存消耗情况。
摘要由CSDN通过智能技术生成

方法一 暴力排序

保证数组从小到大排序,所以最后两个就是最大的石头,每次取最后两个元素进行比较,一样重就直接下一次循环,不一样重就把两个石头重量差push进数组,把数组再次排序

循序嵌套sort排序时间复杂度较高,只是本题测试数据量小才能通过

var lastStoneWeight = function(stones) {
    stones.sort((a,b)=>a-b)
    while(stones.length>1){
       var s1= stones.pop(),
       s2= stones.pop()
       if(s1>s2){
           stones.push(s1-s2)
           stones.sort((a,b)=>a-b)
           console.log(stones)
       }
    }
     if(stones.length===1) return stones[0]
     else return 0
};

 消耗时间和内存情况:

方法二 官方解法(力扣官方题解)

        将所有石头的重量放入最大堆中。每次依次从队列中取出最重的两块石头 a 和 b,必有 a≥b。如果 a>b,则将新石头 a−b放回到最大堆中;如果 a=b,两块石头完全被粉碎,因此不会产生新的石头。重复上述操作,直到剩下的石头少于 2 块。

        最终可能剩下 1 块石头,该石头的重量即为最大堆中剩下的元素,返回该元素;也可能没有石头剩下,此时最大堆为空,返回 0。

Leetcode内置了 @datastructures-js/priority-queue 库。

我们可以使用以下代码新建一个最大优先队列。

let queue = new MaxPriorityQueue()

插入数据和得到最大值,我们分别用enqueue和dequeue方法即可

queue.enqueue(1)

queue.enqueue(1)

let max = queue.dequeue()

PriorityQueue基于堆,可以实现我们一往里加数,它内部就会自动排序

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'];
};

消耗时间和内存情况:

 

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值