55 Jump Game
# 55 Jump Game
题目来源:
https://leetcode.com/problems/jump-game/description/
题意分析:
给定一个正整数列表,每个数字num表示可以从数字的位置往后num步,开始在第一个数字,问能否到达最后一个数字。
栗子:
题目思路:
开始我用了暴力枚举法。列表的每个Index都有一个state,检验能够到达该位置,可以的话设为True,否则False,开始state[0]=True,其他False,从index=0开始,没到一个index,把state[index+1..index+nums[index]]都设为True,然后继续遍历,最后return state[len(nums)-1]就ok。但结果不出意料地超时了。
看了Discuss,觉得智商被碾压了,何须记录每位Index的状态呢,只记录那个能到达的最远的Index就好了呀,只要能到达Index,那么Index前面的肯定都可以到达,假设Index可以从Index1跳来,那么Index1也可以跳转到[Index1+1,Index-1],而假设Index1从Index2跳来,那么同理[Index2+1,Index2-1]也可到达,一直推的话最终都会是从Index=0处开始的。所以只要当前Index没有超过MaxIndex就可以一直往后了呢,然后每次遇到能去到比MaxIndex更远的就更新就好。一旦MaxIndex大于等于最后的Index就可以结束啦。
代码:
1. class Solution:
2. def canJump(self, nums):
3. """
4. :type nums: List[int]
5. :rtype: bool
6. """
7. # state=[False]*len(nums)
8.
9. # state[0]=True
10. # for i in range(0,len(nums)-1):
11. # if (state[i]==True):
12. # for j in range(nums[i],0,-1):
13. # if (i+j<len(nums)):
14. # state[i+j]=True
15. # if (i+j==len(nums)-1):
16. # return True
17.
18.
19. # if (state[-1]):
20. # return True
21. # else:
22. # return False
23.
24. reach=0
25. i=0
26. while(i<len(nums) and i<=reach):
27. reach=max(i+nums[i],reach)
28. i=i+1
29.
30. return reach>=len(nums)-1
31.
32.
33.
提交细节: