本文主要是介绍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)。最多所有的元素都为负数。
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;//判断更新后的和是否小于等于0if(sum<=0){int temp=pq.poll();//补回生命值sum-=temp;//交换到末尾的和other+=temp;count++;}}//最终加上交换到末尾的负数和sum+=other;return sum>0?count:-1;
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~
这篇关于2024.2.6力扣每日一题——魔塔游戏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!