题解 | #牛群迁徙#

77 阅读1分钟

描述

在一片广阔的草原上,牧人带领着牛群迁徙,需要经过一系列河流。每个河流的宽度不同,需要相应长度的跳跃才能成功跨越。给定一个长度为 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];
    }
}