@(labuladong的算法小抄)[dp, 贪心]
leetcode 45. 跳跃游戏 II
题目描述
解题思路
参考:labuladong的算法小抄P377
常规dp(会超时)
时间复杂度是o(n^2),会超时!
class Solution {
public int jump(int[] nums) {
int n = nums.length;
int res = 0;
/* dp[i]表示跳到nums[i]所需的最小次数 */
int[] dp = new int[n];
/* 初始化为n,表示为int_max,因为从0跳到n-1最多需要n-1步 */
Arrays.fill(dp, n);
/* base case */
dp[0] = 0;
for (int i = 1; i < n; i++) {
/* 寻找nums[i]之前的所有能跳到nums[i]位置的最小次数 */
for (int j = 0; j < i; j++) {
/* 如果到达不了,直接跳过 */
if (j + nums[j] < i) continue;
dp[i] = Math.min(dp[i], dp[j] + 1);
}
}
return dp[n - 1];
}
}
贪心
class Solution {
public int jump(int[] nums) {
int n = nums.length;
/* 站在索引i,最多能跳到索引end */
int end = 0;
/* 从索引[i...end]起跳,最远能够到达的距离 */
int farest = 0;
/* 记录跳跃次数 */
int jump = 0;
for (int i = 0; i < n - 1; i++) {
farest = Math.max(farest, i + nums[i]);
/* 如果end==i,则说明当前索引区间[i...end]遍历完毕,已经找到了最具“潜力”的选择,即farest */
if (end == i) {
end = farest;
jump++;
}
}
return jump;
}
}