Leetcode-D21-动态规划(二刷)-55. 跳跃游戏&45. 跳跃游戏 II

我导好好啊!!!刚找完他!充满动力,给个大标题!

55. 跳跃游戏

1、感觉不像是一道很明显的动态规划问题。
2、看下答案和自己的思路是否一致。和我的想法一下,敲代码叭!
3、通过了,但这次好慢呀

class Solution:
    def canJump(self, nums: List[int]) -> bool:
        n = len(nums)
        dp =[True]+[False]*(n-1)
        farmost = nums[0]
        for i in range(n):
            if dp[i]==True:
                farmost = nums[i]
                for j in range(i+1,i+nums[i]+1):
                    if i+nums[i]+1>n-1:
                        return True
                    dp[j] = True
        return dp[n-1]

4、还是标答简单,最远能到达的地方用了动态规划。标答也遍历了o(n),不过只记录了最远能到达的位置,没有用dp更新值,少用了o(n)的空间以及部分的循环。

    def canJump(self, nums: List[int]) -> bool:
        farmost = 0
        for x in range(len(nums)):
            if x<=farmost:
                farmost = max(farmost,x+nums[x])
                if farmost>=len(nums)-1:
                    return True
        return False

45. 跳跃游戏 II

1、最少次数,有点动态规划的味道了。
2、大概有思路了,感觉需要2个o(n)才可以。看下答案。思路不一样,答案思路更简单,但这和动态规划有啥关系?先敲一下代码~思路比较清晰,但不知道怎么用代码表示了哭哭
3、自己写代码还是有点费劲,加入start和end作为开始和结束遍历的点就轻松一点了。

    def jump(self, nums: List[int]) -> int:
        end=0
        start=0
        farmost = 0
        step = 0
        for i in range(len(nums)):
            if farmost>=len(nums)-1:
                return step
            else:
                step+=1
                farmost = max([x+nums[x] for x in range(start,end+1)])
                start = end+1
                end = farmost

你可能感兴趣的:(动态规划,动态规划,leetcode,算法)