一、题目
二、思路
有点类似经典动态规划问题中的爬楼梯问题,一次可以爬1或者2级台阶,问最终爬n阶楼梯有几种方案,这个就是类似于一个二叉树,剪枝后算数量。这里算最短步数,我的思路是每次找当前下标能走的距离内的下标中,可以走的更远的那个,然后下一次的循环就从他开始。(不过最后还要排除一种特殊情况,只有一个元素的时候)
三、题解
1.自己初步尝试
代码如下:
class Solution {
public:
int jump(vector<int>& nums) {
int j = 0;
int max = -1;
int index = -1;
int count = 0;
if(nums.size() == 1){
return 0;
}
while(j < nums.size() && nums[j] + j < nums.size() - 1){
max = -1;
index = -1;
for(int k = j + 1; k <= j + nums[j]; k++){
if(nums[k] + k >= max){
max = nums[k] + k;
index = k;
}
}
j = index;
count++;
}
return count + 1;
}
};
2.看题解后尝试
以上方法实现了AC,但是我感觉可能还有其他更好的方法,于是查阅题解,发现官方给出了一种O(n)复杂度的解法。也是正向搜索。
代码如下
class Solution {
public:
int jump(vector<int>& nums) {
int maxPos = 0, n = nums.size(), end = 0, step = 0;
for (int i = 0; i < n - 1; ++i) {
if (maxPos >= i) {
maxPos = max(maxPos, i + nums[i]);
if (i == end) {
end = maxPos;
++step;
}
}
}
return step;
}
};
此处官方解的思路应该是遍历一遍,每次都更新最远距离,一旦i走到了目前的最远距离,就记一步(因为每次都到最远距离那个点)每个i都求最远距离,那么总能走到,而且步数为1.
总结
官方题解有点想不到,自己的方法还是比较容易想到,也能AC,个人感觉会容易想到的也可以。