【力扣每日一题】力扣LCP30魔塔游戏

题目来源

力扣LCP30魔塔游戏

题目概述

小扣当前位于魔塔游戏第一层,共有 N 个房间,编号为 0 ~ N-1。每个房间的补血道具/怪物对于血量影响记于数组 nums,其中正数表示道具补血数值,即血量增加对应数值;负数表示怪物造成伤害值,即血量减少对应数值;0 表示房间对血量无影响。

小扣初始血量为 1,且无上限。假定小扣原计划按房间编号升序访问所有房间补血/打怪,为保证血量始终为正值,小扣需对房间访问顺序进行调整,每次仅能将一个怪物房间(负数的房间)调整至访问顺序末尾。请返回小扣最少需要调整几次,才能顺利访问所有房间。若调整顺序也无法访问完全部房间,请返回 -1。

思路分析

很显然,数值为正数的房间不需要移动,因为血量无上限。所以我们只需要考虑移动负数房间。 每次遇到负数我们可以放入一个临时缓冲区,并升序排序,这样可以保证每次需要移动通过房间时都把当前能遇到扣血最严重的房间移到后面。(这个临时缓冲区可以用优先级队列实现)

代码实现

java实现

java 复制代码
public class Solution {
    public int magicTower(int[] nums) {
        long sum = 1;
        int result = 0;
        long temp = 0;
        PriorityBlockingQueue<Integer> negativeQueue = new PriorityBlockingQueue<>(nums.length);
        for (int data : nums) {
            // 把扣血房间放入有限集队列排序
            if (data < 0) {
                negativeQueue.offer(data);
            }
            sum += data;
            // 如果血量为空,把扣血最多的房间移到最后
            if (sum < 1) {
                int poll = negativeQueue.poll();
                result++;
                temp += poll;
                sum -= poll;
            }
        }
        return sum + temp > 0 ? result : -1;
    }
}

c++实现

cpp 复制代码
class Solution{
public:
	int magicTower(vector<int>& nums) {
        priority_queue<int, vector<int>, greater<int>> negative_queue;
        long sum = 1;
        int result = 0;
        long temp = 0;
        for (int data : nums) {
			// 负数房间放入优先级队列排序
            if (data < 0) {
                    negative_queue.push(data);
            }
            sum += data;
			// 血量为负把扣血最严重的房间向后移
            if (sum < 1) {
                int top = negative_queue.top();
                result++;
                temp += top;
                sum -= top;
                negative_queue.pop();
            }
        }
         return sum + temp > 0 ? result : -1;
    }
}
相关推荐
潇湘散客几秒前
CAX软件插件化设计实战:从框架到3D基础功能落地
c++·图形学·opengl
大袁同学1 分钟前
【线程】:在并发的荒原上构筑秩序
linux·c++·线程
程序员三明治3 分钟前
【AI】一文讲清 RAG:从大模型局限到企业级知识库落地流程
java·人工智能·后端·ai·大模型·llm·rag
Devin~Y4 分钟前
大厂 Java 面试实录:Spring Boot/Cloud、Kafka、Redis、JVM、K8s、RAG 一条龙(小Y翻车版)
java·jvm·spring boot·redis·spring cloud·kafka·kubernetes
无限进步_4 分钟前
【C++】深入右值引用:移动语义与完美转发
java·开发语言·c++
霑潇雨5 分钟前
原生 Zookeeper 实现分布式锁案例
java·分布式·zookeeper·云原生·maven
小王C语言6 分钟前
【线程同步与互斥】:互斥量(锁)、条件变量(唤醒等待线程)、生产者消费者模型
java·开发语言
我命由我123459 分钟前
Jetpack Compose - 设置 Compose 编译器、设置 Compose 依赖项
android·java·java-ee·kotlin·android jetpack·android-studio·android runtime
csdn_aspnet11 分钟前
C++ (Naive Partition Algorithm)朴素划分算法
数据结构·c++·算法
eggrall12 分钟前
找到字符串中所有字母异位词(medium)
算法·leetcode·职场和发展