描述
在一片广阔的草原上,牧人带领着牛群迁徙,需要经过一系列河流。每个河流的宽度不同,需要相应长度的跳跃才能成功跨越。给定一个长度为 n 的整数数组 rivers。初始位置为 rivers[0]。
每个元素 rivers[i] 表示从正在当前河流边缘向前跳跃的最大长度。换句话说,牧人在每片河流边缘时,可以跳跃到任意 rivers[i + j] 处:
0 <= j <= rivers[i]
i + j < n
现在牧人想知道他从初始位置到达 rivers[n - 1] 需要的最小跳跃次数。
示例1
输入:[3, 4, 2, 1, 5]
返回值:2
说明:跳到最后一个位置的最小跳跃数是 2。 从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 4 步到达数组的最后一个位置。
备注:
所有案例可以保证牧人能到达指定位置。
1 <= nums.length <= 10^5
0 <= nums[i] <= 2000
知识点
动态规划
解题思路
定义一个数组 dp,其中 dp[i] 表示从初始位置到达第 i 个河流所需的最小跳跃次数。初始时将所有dp[i]都定义为无法跳跃,后面遍历更新它。接下来,我们遍历每一个i,对于每个河流 rivers[i],我们需要找到前面的河流 rivers[j] (0 <= j < i),使得从 rivers[j] 可以一次跳跃到 rivers[i]。我们可以通过遍历 j 的方式来找到最小的 dp[j],再加上一次跳跃即可更新 dp[i]。即dp[i] = min(dp[i], dp[j] + 1)。最终,dp[n-1] 就表示从初始位置到达最后一个河流所需的最小跳跃次数。
Java题解
import java.util.*;
public class Solution {
public int min_jumps (int[] rivers) {
// write code here
int n = rivers.length;
int[] dp = new int[n];
Arrays.fill(dp, Integer.MAX_VALUE);
dp[0] = 0;
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if (j + rivers[j] >= i) {
dp[i] = Math.min(dp[i], dp[j] + 1);
}
}
}
return dp[n - 1];
}
}