leetcode第55题,跳跃游戏
贪心:
- 如何判断是否可以到达最后一个下标所处的位置呢?
- nums[i] > nums.length - i,就说明我一定可以到了最后的位置,换到了程序里面,就是利用原本fast的值和nums[i] + i,进行比较,更新对应的fast
- 如果发现从这个位置可以直接到达最后的一个位置,我就直接返回true,我不需要看后面是不是依旧可以到达我想要的那个位置。
class Solution {
public boolean canJump(int[] nums) {
//为什么要这样写的啊!我不是很懂,但是还是必须要学
int fast = 0;
for(int i = 0;i <= fast;i++){
fast = Math.max(fast,nums[i] + i);
if(fast >= nums.length - 1){
return true;
}
}
return false;
}
}
动态规划:
- 动态规划很显然就笨了不止一点,但是我坚信,即使是贪心的思路,也是由动态规划的思路延伸过来的。
- dp数组的定义:是不是可以从下标为0的位置到达下标为i的位置,dp数组的长度就是nums的长度
- 初始化,第一个位置是起点,一定是可以到的。dp【0】 = true;
- 如何判断dp【i】也是可到的呢?
- i之前有任意的一个位置可以到达i的位置,当前位置就为trrue,一定break不要让他在往下走了。也是判断nums【j】 >= i - j
- 这不是?贪心的思路就出来了。
- 状态转移方程比较自然的写出来了,条件:dp【j】 == true && nums【j】 >= i - j 。
- 返回最后一个位置是不是可以到达。
class Solution {
public boolean canJump(int[] nums) {
//试一试dp的思路
boolean[] dp = new boolean[nums.length];
dp[0] = true;
for(int i = 1;i < dp.length;i++){
for(int j = 0;j < i;j++){
if(dp[j] && nums[j] >= i - j){
dp[i] = true;
break;
}
}
}
for(int i = 0;i < dp.length;i++){
System.out.print(dp[i] + " ");
}
return dp[dp.length - 1];
}
}