LeetCode 045 Jump Game II

来源:互联网 发布:手机上头像源码怎么用 编辑:程序博客网 时间:2024/05/22 05:09

题目给出一个数组,数组中的数字表示在这个位置上可以最多可以跳多远的距离。从0位置开始跳,问最少跳多少步可以到数组末尾。

例如:

Given array A = [2,3,1,1,4]

The minimum number of jumps to reach the last index is 2. (Jump 1 step
from index 0 to 1, then 3 steps to the last index.)

首先想到的是每次跳跃必然是向末尾跳的。如果一个解含有向开头跳的步骤,那么往开头跳的那一步和前一步:

------------->     <--------

必然可以用往末尾跳的一步替代:

------------->     <------------->

因为最多可以跳多少并不代表一定要跳多少。

然后就可以得到一个递推公式:令f[i]表示跳到i位置的最少步骤。
边界条件:

f[0]=0f[i]=INT_MAX i>0

方程:

f[i+j]=min(f[i+j],f[i]+1) 1<=j<=A[i]

需要用两重循环,时间复杂度太高。

因此需要优化。

观察f,可发现f一定是递增的。因为不可能跳的更近反而步数更多。所以只需要一重循环即可,记录当前可跳到的最远位置,和下一步可跳到的最远位置。如果当前位置i大于当前可跳到的最远位置,就把所需步数加一,当前可跳到的最远位置设为下一步可跳到的最远位置。同时更新下一步可跳到的最远位置:max(i+A[i])。

时间复杂度为O(n)。

0 0
原创粉丝点击