45. 跳跃游戏 II
难度中等
给你一个非负整数数组 nums ,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。
示例 1:
输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
示例 2:
输入: nums = [2,3,0,1,4]
输出: 2
提示:
- 1 <= nums.length <= 104
- 0 <= nums[i] <= 1000
思路:
- nums=[0]
忽略了0步 - nums=[2,3]
忽略了一步 - nums=[1,2,1,1,1]
数值相同,步伐最大 - nums=[10,9,8,7,6,5,4,3,2,1,1,0]
选择下一个落点,比值是取下一个最远落点 j+nums[j]
代码
class Solution {
public:
int jump(vector<int>& nums) {
int i,j,flag,s;
i=flag=s=0;
j=1;
if(nums.size()==1)
{
return 0;
}
if(i+nums[i]>=nums.size()-1)
{
return 1;
}
s=0;
while(i<nums.size())
{
s++;
printf("%d,%d\n",i,nums[i]);
flag=i+1;
while(j<=i+nums[i])
{
if(j+nums[j]>=flag+nums[flag])
{
flag=j;
printf("--%d,%d\n",j,flag);
}
j++;
}
printf("--%d\n",flag);
i=flag;
j=i+1;
if(i+nums[i]>=nums.size()-1)
return s+1;
}
return s;
}
};