这道题也很简单的,不知道难点在哪。以下为题目地址:
这道题的意思,就是给定一个数组。数组中的每一个元素代表从当前位置跳一次的最大步长(比如第k个元素最大跳i步,可以到达第k+1到k+i数中任意一个位置)。我们的任务是找出跳到最后一个数的最小步长并返回。
这道题主要是要明确前面的数一定比后面的数需要更少的步数就可以达到。于是,只需要维持一个保存步长的数组,对数组每一个数,找出可以一步到达这个数的最前的位置,只需要让最前的数保存的步长加一就可以了。为了找出这个数,我们只需要遍历一遍数组,对每个数可以达到的位置,把还没有被记录步长的位置设为步长加一就可以了。这有一点类似于动态规划中的“刷表法”。
下面给出代码:
class Solution {
public:
int jump(vector<int>& nums) {
int i, j, temp, maxn = 0, s=nums.size();
vector<int> steps(s);
for(i=0;i<s;i++)
{
temp = i + nums[i];
if(temp>maxn)
{
for(j=maxn + 1;j<=min(temp, s-1);j++)
steps[j] = steps[i] + 1;
maxn = temp;
}
}
return steps[s-1];
}
};
上面这个代码是第一次提交的代码,后面其实还尝试做了一点优化,结果反而更慢了:
class Solution {
public:
struct node{
int x, y;
};
int jump(vector<int>& nums) {
int i, temp, maxn = 0, s=nums.size(), cur = 0;
vector<node> steps;
node n;
n.x=0;
n.y=0;
steps.push_back(n);
for(i=0;i<s;i++)
{
temp = i + nums[i];
if(temp>maxn)
{
while(i>steps[cur].x)
cur++;
if(temp >= s-1)
return s==1?0:(steps[cur].y + 1);
n.x = temp;
n.y = steps[cur].y + 1;
steps.push_back(n);
maxn = temp;
}
}
return steps[steps.size()-1].y;
}
};
下面是提交结果: