Given an array of non-negative integers, you are initiallypositioned at the first index of the array.
Each element in the array represents your maximum jump length atthat position.
Your goal is to reach the last index in the minimum number ofjumps.
For example:
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.)
Note:
You can assume that you can always reach the last index.
这一题估计很多人第一次遇到都会马上想到dp,dp[i]=min{dp[j]+1},j=0~i-1,但是这样的话计算时间复杂度为O(n^2),这种解决方法不应该是hard题应该有的难度,一提交果然超时了
后来我又想了一会,是否有更快的方法能够解决这一题,果然被我想到了,这一题使用贪心算法的话可以在O(n)的时间内得到结果,使用theLine数组来记录到达某个地点需要的最小步数,每个数最多循环一次,其在theLine数组里面的值最多修改一次,总时间为O(n)
class Solution {
public:
int jump(vector<int>& nums) {
int n = nums.size();
if(n==1) return 0;
vector<int> theLine(n, 0);
int left, right, l;
left = 0; right = 0;
while (left <= right)
{
l = nums[left] + left;
if (l >= n-1) return theLine[left] + 1;
if (nums[left] + left > right)
{
for (int i = nums[left] + left; i > right; i--)
{
theLine[i] = theLine[left] + 1;
}
right = l;
}
left++;
}
return 1;
}
};