这个题是典型的DP了,LeetCode有一点很不好,他不告诉你数据量大小,我就直接写了个很暴力的n方的dp然后挂在一组25000长度的数据上,然后我就在原来的基础上进行了剪枝,加了一个step,记录一下每个step最远能走到哪,就优化成On的了然后就过了。找了一下题解,发现有更简单的,空间复杂度O1的方法。。。
"""
public int jump(int[] A) {
if(A==null || A.length==0)
return 0;
int lastReach = 0;
int reach = 0;
int step = 0;
for(int i=0;i<=reach&&i<A.length;i++)
{
if(i>lastReach)
{
step++;
lastReach = reach;
}
reach = Math.max(reach,A[i]+i);
}
if(reach<A.length-1)
return 0;
return step;
}
"""
class Solution(object):
def jump(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
Len=len(nums)
if Len<=1:return 0
dp=[0x7fffffff for x in range(Len)]#steps needed for reaching point i
step=[0 for x in range(Len)]# maxIndex that i steps can reach
dp[0]=0
for i in range(0,Len-1):
if nums[i]+i>=Len-1:
return dp[i]+1
maxJump=nums[i]
curStep=dp[i]
for j in range(step[curStep]+1,i+maxJump+1):
dp[j]=min(dp[j],dp[i]+1)
step[curStep+1]=max(step[curStep+1],i+maxJump)
return dp[Len-1]