力扣-45.跳跃游戏II
题目链接
45.跳跃游戏II
解法一:贪心算法
class Solution {public int jump(int[] nums) {int step = 0;int end = 0;int maxLength = 0;for (int i = 0; i < nums.length - 1; i++) {if (i + nums[i] > maxLength) {maxLength = i + nums[i];}if (i == end) {step++;end = maxLength;}}return step;}
}
小结:时间复杂度O(n),空间复杂度O(1),是本题的最优解。
- 为什么可以用贪心算法?
这道题并不是每个点都选当前最远来跳跃,而是每个区域选最远跳跃,局部最优可以推导出全局最优。 - 怎么用贪心算法?
只有遍历到上次的最大下标位置才进行跳跃,并且对最大下标位置进行更新。
解法二:动态规划
class Solution {public int jump(int[] nums) {int dp[] = new int[nums.length];Arrays.fill(dp, 10001);dp[0] = 0;for (int i = 0; i < nums.length; i++) {for (int j = i + 1; j < nums.length && j <= i + nums[i]; j++) {dp[j] = Math.min(dp[j], dp[i] + 1);}}return dp[nums.length - 1];}
}
小结:最先想到的解法是动态规划,时间复杂度O(n²),空间复杂度O(n)。
dp
数组含义?到达当前位置的最小跳跃次数。