给定一个非负整数数组,您最初位于该数组的第一个索引处。数组中的每个元素代表该位置的最大跳转长度。目标是在最少的跳数中达到最后的索引。
Input:[2,3,1,1,4]
Output:2 (第一步从2到3, 然后从3到4)
Clue: 其实就每次选择当前数值A的后A位最大值B的位置, 然后以以B为标准重复选择后面B个数的最大值直到最后。
class Solution:
def jump(self, nums: List[int]) -> int:
if len(nums) <= 1: return 0
max_pos, max_steps, res = nums[0], nums[0], 1
for i in range(1, len(nums)): #从第2个数开始遍历
if max_steps < i: #
res += 1 #向前蹦了一次
max_steps = max_pos #已经蹦到最大的那个数的位置
max_pos = max(max_pos, nums[i] + i) #定位下一次蹦位置
return res
Java
class Solution {
public int jump(int[] nums) {
if (nums.length < 2) {
return 0;
}
int maxPos = nums[0], maxStep = nums[0], res = 1;
for (int i=1; i < nums.length;i++) {
if (maxStep < i) {//能向前走的最大步子
res++;
maxStep = maxPos;
}
maxPos = Math.max(nums[i] + i, maxPos);
}
return res;
}
}
时间复杂度O(n)