2024.2.6力扣每日一题——魔塔游戏

2024.2.6

题目来源

力扣每日一题;题序:LCP 30

我的题解

方法一 贪心+优先队列

思路 :使用贪心的思想,从左到右遍历,若遇到加上当前房间的生命值后小于等于0,由于需要调整的次数最小,则贪心地将当前以及前面房间中生命值最小的 移到末尾。直到遍历完所有房间。
具体:在遍历房间的过程中,将为负数的生命值加入到一个小根堆pq中,当计算完每个房间的生命值sum影响后,如果生命值sum小于等于0,则将堆顶元素取出,并使用外的变量other记录从小根堆pq中取出元素的和,这时需要在生命值中补回相应的生命值以及调整次数加1。当遍历完所有房间有,再将other的值重新加入到sum中,若最终的sum小于等于0,则表示无解。
时间复杂度 :O(nlogn)。需要遍历一次数组O(n),并且遍历过程中存在优先队列的入队和出队操作O(logn)
空间复杂度:O(n)。最多所有的元素都为负数。

java 复制代码
public int magicTower(int[] nums) {
//记录交换的次数
    int count=0;
    //记录和,有坑......可能出现整形溢出
    long sum=1;
    //交换到末尾的值的和
    int other=0;
    PriorityQueue<Integer> pq=new PriorityQueue<>();
    for(int i=0;i<nums.length;i++){
        int t=nums[i];
        //若为负数加入到小根堆
        if(t<0)
            pq.offer(t);
         //更新和
        sum+=t;
        //判断更新后的和是否小于等于0
        if(sum<=0){
            int temp=pq.poll();
            //补回生命值
            sum-=temp;
            //交换到末尾的和
            other+=temp;
            count++;
        }
    }
    //最终加上交换到末尾的负数和
    sum+=other;
    return sum>0?count:-1;
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

相关推荐
雨奔2 小时前
Kubernetes DNS 完全指南:服务发现核心机制与实践
java·kubernetes·服务发现
DuHz2 小时前
论文精读:大语言模型 (Large Language Models, LLM) —— 一项调查
论文阅读·人工智能·深度学习·算法·机器学习·计算机视觉·语言模型
加农炮手Jinx2 小时前
LeetCode 72. Edit Distance 题解
算法·leetcode·力扣
借雨醉东风2 小时前
程序分享--常见算法/编程面试题:旋转矩阵
c++·线性代数·算法·面试·职场和发展·矩阵
逻辑驱动的ken2 小时前
Java高频面试考点场景题14
java·开发语言·深度学习·面试·职场和发展·求职招聘·春招
阿冰冰呀2 小时前
互联网大厂Java求职面试实录:谢飞机的“水货”之路
java·mybatis·dubbo·springboot·线程池·多线程·hashmap
_深海凉_2 小时前
LeetCode热题100-打家劫舍
算法·leetcode·职场和发展
水无痕simon3 小时前
1.单机部署Nacos1.3.2
java
jghhh013 小时前
使用 MATLAB 实现支持向量回归 (SVR) 预测未来数据
算法·matlab
云泽8084 小时前
笔试算法 - 双指针篇(二):四大经典求和题型 + 有效三角形计数问题
c++·算法