一、题意
给出一个非负整数数组 nums ,数组中的每个元素代表在该位置可以跳跃的最大长度。使用最少的跳跃次数到达数组的最后一个位置。假设总是可以到达数组的最后一个位置。
二、解法
贪心算法。
解法一:
反向查找:
从头开始找到第一个能到n-1位置的下标i,再从头开始找到第一个能到i的下标j,一直到回到起点。
时间复杂度:
O
(
n
2
)
O(n^2)
O(n2)
空间复杂度:
O
(
1
)
O(1)
O(1)
解法二(官方):
从头开始遍历:
end为当前能到达的最大下标位置,初始为0
maxP= max(maxP,nums[i]+i);
到达end就更新end为当前能到达的最大下标位置maxP,直到end>=n-1
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)
三、代码
1、解法一
int jump(vector<int>& nums) {
int n =nums.size();
int num=0;
int t=n-1;
while(t>0){
for(int i=0;i<n;i++){
if(nums[i]+i>=t){
t = i;
num++;
break;
}
}
}
return num;
}
2、解法二
int jump(vector<int>& nums) {
int n =nums.size();
int num=0;
int maxP=0;
int end=0;
for(int i=0;i<n-1&&end<n-1;i++){
maxP = max(maxP,nums[i]+i);
if(i==end){
num++;
end = maxP;
}
}
return num;
}