LeetCode 45
前面做了Jump Game V,就考虑把Jump Game 系列都看看。
这个题目是要求最少steps到达最后一个位置,并且保证一定是有解的。
第一个方法,最简单的考虑,从每个位置出发,去求到达后面的位置的最少steps是什么。
def jumpSlowVersion(self, nums: List[int]) -> int:
dp = [sys.maxsize]*len(nums)
dp[0] = 0
for i,n in enumerate(nums):
for j in range(1, nums[i]+1):
if j+i < len(nums):
dp[j+i] = min(dp[j+i], dp[i] + 1)
return dp[len(nums)-1]
代码很简单,但是效率不够,双重循环,时间效率O(N^2).
上面的方法中,考虑某个位置i,那么对于j+i的位置,如果曾经有从更正的i -x,直接能reach到位置,其实应该就是有更少的step。基于这个,其实我们不需要遍历,只要记录每个step之后,我们最远能走到那里。然后根据这个step,来求下一个step最远能到那里,如果reach到了最后一个位置,那么返回结果。
def jump(self, nums: List[int]) -> int:
if len(nums) <=1: return 0
dp = [0]*(len(nums)+1)
dp[0] = 0
dp[1] = nums[0]
step = 1
currentPos = 0
while dp[step] < len(nums) -1:
dp[step+1] = max(pos + nums[pos] for pos in range(dp[step-1]+1, dp[step] + 1))
step +=1
return step