当前位置:   article > 正文

跳格子问题(LeetCode第55题 跳跃游戏)平民解_跳格子,你必须跳n格才能完成任务,但是你每次只能跳一格,两格或者三格,但是每次跳3

跳格子,你必须跳n格才能完成任务,但是你每次只能跳一格,两格或者三格,但是每次跳3

目录

三种思路

1.动态规划(结果超时)

2.贪心法

3.换一种思路


三种思路

1.动态规划(结果超时)

时间复杂度为o(n^2)

  1. def canJump(self, nums):
  2. """
  3. :type nums: List[int]
  4. :rtype: bool
  5. """
  6. '''最后一步A(n-1)是由前一步Ai跳过来的
  7. 则只要满足:
  8. 1.能跳到前一步Ai
  9. 2.n-1-i<=nums[i](前一步到最后一步的距离<=最大跳的距离num[i])
  10. 第二个条件很好判断,则关键就变为能否跳到第i个石头
  11. '''
  12. n=len(nums)
  13. dp=[0]*n #dp[i]表示青蛙能否跳到第i块石头
  14. dp[0]=1
  15. for i in range(1,n):
  16. for j in range(i):
  17. if dp[j] and i-j<=nums[j]:
  18. dp[i]=1
  19. break
  20. return (True if dp[n-1] else False)

2.贪心法

时间复杂度为o(nlog(n))

  1. def canJump(self, nums):
  2. """
  3. :type nums: List[int]
  4. :rtype: bool
  5. """
  6. '''贪心法
  7. 每一次都跳到选择最多(即跳的最远)的位置,这样他下一步能走的就包括了所有解,如果都不能到,就说明没有解(因此这一题能用贪心法)
  8. 即max(nums[i]+i-pos)
  9. '''
  10. n=len(nums)-1
  11. pos=0 #记录当前的位置
  12. if n==0:
  13. return True
  14. if nums[0]==0:
  15. return False
  16. for i in range(1,n+1):
  17. if pos+nums[pos]>=n:
  18. return True
  19. else:
  20. pos+=max(map(lambda x:(nums[pos+x]+x,x),range(1,nums[pos]+1)))[1]#跳到选择最多的位置
  21. if pos>=n:
  22. return True
  23. if nums[pos]==0: #动不了了
  24. return False
  25. else:
  26. return False

3.换一种思路

受LeetCode讨论区ylem大佬启发,将格子上的数字作为能量,而每走一步就需要耗费一个能量,如果在能量耗尽之前到了终点,那么就成功,否则失败(期间可以拿自己身上的能量与格子的能量进行交换),这样时间复杂度就为o(n)

  1. def canJump(self, nums):
  2. """
  3. :type nums: List[int]
  4. :rtype: bool
  5. """
  6. n=len(nums)
  7. if n==1:
  8. return True
  9. energy=nums[0]
  10. for i in range(1,n):
  11. if energy==0: #每次启动之前都要检查一下是否有能量
  12. return False
  13. energy-=1
  14. if energy<nums[i]:
  15. energy=nums[i]
  16. else:
  17. return True

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/208979
推荐阅读
相关标签
  

闽ICP备14008679号