这道题目和以前一道能不能跳到最后一点的题目有比较类似的思路,但是要稍微难一点,因为要求出最小的跳数。
题目的大体意思是这样的,给定一个一维数组,数组中每一位上的数字表示从该位置能向后一跳的最远距离是多少(之所以说最远是可以在0~最远值之间任意选择一个合适的数值),问到达最后一个位置所经历的最小跳数。这种题目基本上穷举是肯定不行的,因此,要有一些小的处理技巧。另外,值得注意的是,这道题给出的所有测试用例没有不能到达的情况。
要知道哪种方案跳数最低,在未能到达最后一个位置之前,必须要对所有点进行遍历,来查看所有可能的情况,从而选择最优。
从出发位置开始,设置一个变量每次循环都记录从该位置能到达的最远位置是多少,该变量用来表示我们下一次循环都有哪些新的点可以遍历到,然后继续往后遍历,直到到达最后一点为止。
理论讲起来比较费解,但是代码很简单,只要55题做了,这道题不难理解
class Solution {
public:
int jump(vector<int>& nums) {
int minstep = 0;
int cur = 0, i = 0, maxsize = 0;
while (cur < nums.size()-1) {
++minstep;
maxsize = cur;
for (; i<=maxsize; ++i) {
cur = max(cur, i+nums[i]);
}
}
return minstep;
}
};