大家好,关于leetcode_lcp30_go_魔塔游戏很多朋友都还不太明白,今天小编就来为大家分享关于的知识,希望对各位有所帮助!
小口目前位于魔法塔游戏的一楼。共有N个房间,编号为0~N-1。
每个房间的补血道具/怪物对血量的影响记录在数组nums中,其中正数代表道具的补血值,即血量增加对应的值;
负数表示怪物造成的伤害值,即血量减少对应的值; 0表示房间对血量没有影响。
小扣的初始血量为1,没有上限。假设小口原本打算按照房间号升序访问所有房间来补血/杀怪,以保证血量始终为正,
小口需要调整房间的进出顺序。一次只能调整一个怪物房间(负号房间)到访问顺序的末尾。
请返回到那个小按钮,至少需要调整几次才能成功访问所有房间。如果调整顺序后仍无法进入所有房间,请返回-1。
示例1: 输入:nums=[100,100,100,-250,-60,-140,-50,-50,100,150] 输出:1
解释:初始健康卷为1,至少需要将nums[3]调整到访问序列的末尾才能满足要求。
示例2:输入:nums=[-200,-300,400,0] 输出:-1
说明:即使调整访问顺序也无法完成对所有房间的访问。
提示:1=nums.length=10^5
-10^5=数字[i]=10^5
解题思路分析
1. 堆;时间复杂度O(nlog(n)),空间复杂度O(n)
func magicTower(nums []int) int { intHeap :=make(IntHeap, 0) heap.Init(intHeap) 血液:=0 sum :=0 res :=0 for i :=0;我len(nums); i++ { sum=sum + nums[i] if nums[i] 0 { heap.Push(intHeap, nums[i]) if Blood+nums[i] 0 { res++ minValue :=heap.Pop(intHeap).(int ) 血液=血液- minValue } } 血液=血液+ nums[i] } if sum 0 { return -1 } return res}type IntHeap []intfunc (h IntHeap) Len() int { return len(h)}//小根堆、大根堆变换方向func (h IntHeap) Less (i, j int) bool { return h[i] h[j]}func (h IntHeap) Swap(i, j int) { h[i] , h [j]=h[j], h[i]}func (h *IntHeap) Push(x 接口{}) { *h=追加(*h, x.(int))}func (h *IntHeap) ) Pop() 接口{} { 值:=(*h)[len(*h)-1] *h=(*h)[:len(*h)-1] 返回值}
2. 堆;时间复杂度O(nlog(n)),空间复杂度O(n)
func magicTower(nums []int) int { sum :=0 for i :=0;我len(nums); i++ { sum=sum + nums[i] } if sum 0 { return -1 } intHeap :=make( IntHeap, 0) heap.Init(intHeap) 血液:=0 res :=0 for i :=0;我len(nums); i++ { heap.Push(intHeap, nums[i]) 血液=血液+ nums[i ] 如果血液0 { minValue :=heap.Pop(intHeap).(int) 血液=血液- minValue res++ } } return res}type IntHeap []intfunc (h IntHeap) Len() int { return len(h)}//小根堆、大根堆变换方向func (h IntHeap) Less(i, j int) bool { return h[i] h [j]}func (h IntHeap) Swap(i, j int) { h[i] , h[j]=h[j], h[i]}func (h *IntHeap) Push(x 接口{}) { *h=append(*h, x.(int))}func (h *IntHeap ) Pop() 接口{} { 值:=(*h)[len(*h)-1] *h=(* h)[:len(*h)-1]返回值}
总结
用户评论
这题感觉不太难嘛!用滑动窗口法就能解了,关键是理解一下“魔塔”这个概念,然后代码逻辑就很好写出来。
有11位网友表示赞同!
LeetCode LC30 真的考得太累了…这题目我尝试过各种方法,最后还是参考答案看懂了为什么我的方式不对
有16位网友表示赞同!
这道题的解法思路挺巧妙的。用滑动窗口来维护一个区间内的最大值和最小值,每次更新滑动窗口的时候再更新魔塔的状态,这样就能不断迭代优化解到最终目标!
有18位网友表示赞同!
刚开始看到题目理解有点困难, 后来仔细研读题意,发现其实是要找到最优的策略才能成功通关魔塔游戏。真是考验人思维能力的一道题
有14位网友表示赞同!
我也刚做完这题,感觉代码逻辑还是比较清晰的,关键要注意边界条件和状态转移的细节!
有8位网友表示赞同!
玩过手机上的游乐园类型的魔塔游戏吗? 这题目感觉很像,就是通过不断爬塔来挑战不同的关卡。不过代码实现稍微复杂一些,需要仔细思考策略才能写出高效的解法!
有10位网友表示赞同!
我之前学过滑动窗口法,所以这题还是比较好写的。主要是要明白魔塔游戏规则,然后将题目描述映射到算法里就OK了!
有16位网友表示赞同!
这段代码真是太简洁了!佩服作者的算法功底和思想,这么复杂的“魔塔游戏”也能用简单清晰的方式表达出来!
有10位网友表示赞同!
这题我尝试了很多方法,但都无法找到最优解。是不是需要更高的时间复杂度才能解决这个问题?
有10位网友表示赞同!
感觉这道题目偏向考查算法设计能力, rather than 纯粹的代码实现。 而且测试用例的规模比较大,需要考虑代码的时间和空间复杂度优化!
有13位网友表示赞同!
这个解法真的太棒了,完美解决了魔塔游戏的挑战。我强烈推荐大家学习一下这种巧妙的算法思路!
有9位网友表示赞同!
这题的题目描述和官方解答都写的比较抽象,感觉不太容易理解它的核心思想。希望有大神能用更通俗易懂的方式解释一下解法原理?
有9位网友表示赞同!
刚开始看题目的时候,完全没有思路,后来对比别人的代码才发现关键是利用滑动窗口来优化解题效率!
有20位网友表示赞同!
我已经尝试了很多方法,仍然无法通过样例用例测试。看来我需要继续加强算法基础知识的学习!
有7位网友表示赞同!
这道题目确实挺 challenging 的,但最终成功通过后感觉收获很大。通过它的解题过程,我对滑动窗口法有了更深入的理解!
有12位网友表示赞同!
对于初学者来说这道题可能会比较困难,因为需要对“魔塔游戏”和算法逻辑都有较好掌握。可以先练习一些基础的滑动窗口题目来打下基础!
有15位网友表示赞同!
LeetCode 的题目真的越来越难了,这道 “魔塔游戏” 可以算是近年来最费劲的一题! 不过解决问题的感觉真的很棒,我被它激发了很多编程灵感?!
有5位网友表示赞同!
代码实现简单易懂, 但是分析题目逻辑还是需要花一番心思。 这说明算法能力并非仅限于熟练运用各种方法,还需要具备良好的理解和抽象能力!
有18位网友表示赞同!