题目为 给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
一开始的思路为递归回溯出所有的可能性,找到所有的情况下的最小值,代码如下 (超时)
public int Jump(int[] nums)
{
if (nums.Count()==0)
{
return 0;
}
jumpAll(nums, 0, 0);
return minValJump;
}
int minValJump = int.MaxValue;
public void jumpAll(int[] nums, int position, int jumpCount)
{
if (jumpCount >= minValJump)
{
return;
}
if (position >= nums.Count()-1)
{
if (jumpCount < minValJump)
{
minValJump = jumpCount;
}
return;
}
int maxStep = nums[position];
for (int i = 1; i <= maxStep; i++)
{
jumpAll(nums, position + i, jumpCount + 1);
}
}
看了题解,明白其实只要走对应长度内最大的那个就已经是最小路径了,对代码进行优化后,如下
public int Jump(int[] nums)
{
int steps = 0, end = 0, maxPos = 0;
for (int i = 0; i < nums.Length - 1; i++)
{
maxPos = Math.Max(maxPos, nums[i] + i);
if (i == end) {
end = maxPos;
++steps;
}
}
return steps;
}