吉游网提供最新游戏下载和手游攻略!

leetcode_lcp30_go_魔塔游戏

发布时间:2024-09-23浏览:95

大家好,关于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位网友表示赞同!

有一种中毒叫上瘾成咆哮i

我之前学过滑动窗口法,所以这题还是比较好写的。主要是要明白魔塔游戏规则,然后将题目描述映射到算法里就OK了!

    有16位网友表示赞同!

爱你的小笨蛋

这段代码真是太简洁了!佩服作者的算法功底和思想,这么复杂的“魔塔游戏”也能用简单清晰的方式表达出来!

    有10位网友表示赞同!

愁杀

这题我尝试了很多方法,但都无法找到最优解。是不是需要更高的时间复杂度才能解决这个问题?

    有10位网友表示赞同!

烟雨萌萌

感觉这道题目偏向考查算法设计能力, rather than 纯粹的代码实现。 而且测试用例的规模比较大,需要考虑代码的时间和空间复杂度优化!

    有13位网友表示赞同!

景忧丶枫涩帘淞幕雨

这个解法真的太棒了,完美解决了魔塔游戏的挑战。我强烈推荐大家学习一下这种巧妙的算法思路!

    有9位网友表示赞同!

半世晨晓。

这题的题目描述和官方解答都写的比较抽象,感觉不太容易理解它的核心思想。希望有大神能用更通俗易懂的方式解释一下解法原理?

    有9位网友表示赞同!

浅笑√倾城

刚开始看题目的时候,完全没有思路,后来对比别人的代码才发现关键是利用滑动窗口来优化解题效率!

    有20位网友表示赞同!

拥抱

我已经尝试了很多方法,仍然无法通过样例用例测试。看来我需要继续加强算法基础知识的学习!

    有7位网友表示赞同!

红尘烟雨

这道题目确实挺 challenging 的,但最终成功通过后感觉收获很大。通过它的解题过程,我对滑动窗口法有了更深入的理解!

    有12位网友表示赞同!

顶个蘑菇闯天下i

对于初学者来说这道题可能会比较困难,因为需要对“魔塔游戏”和算法逻辑都有较好掌握。可以先练习一些基础的滑动窗口题目来打下基础!

    有15位网友表示赞同!

一生只盼一人

LeetCode 的题目真的越来越难了,这道 “魔塔游戏” 可以算是近年来最费劲的一题! 不过解决问题的感觉真的很棒,我被它激发了很多编程灵感?!

    有5位网友表示赞同!

最怕挣扎

代码实现简单易懂, 但是分析题目逻辑还是需要花一番心思。 这说明算法能力并非仅限于熟练运用各种方法,还需要具备良好的理解和抽象能力!

    有18位网友表示赞同!

热点资讯