给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例:
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/jump-game-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我花了四三个小时,而且这段代码写的那么糟糕,其实思路很简单,还是边界问题,我完全就是在试试,并没有真的分析出来该怎么怎么办的那种流畅。
class Solution {
public:
int jump(vector<int>& nums) {
int len = nums.size();
if(len==1)
return 0;
int jump_count = 0;
int pos = 0;
while(nums[pos]+pos < len-1) //不足一跳
{
int max_pos = pos;
cout << pos << endl;
for(int i=pos+1; i<=pos+nums[pos] && i<len; i++)
{
if(max_pos+nums[max_pos] <= i+nums[i])
max_pos = i;
}
pos = max_pos;
jump_count++;
}
jump_count++;
return jump_count;
}
};
//[1,2,3]
//[2,0,2,0,1]
//[2,3,1]
//[3,1,9,0,4,4,8,4,7,0,8,4,3,1,2]
还有两种思路:搜索和使用一个边界框的贪心算法。