leetcode第45题,跳跃游戏
**动态规划:**还算是思路比较简单吧。
- dp数组的定义:到达以i结尾的位置所需要的最小步数。
- dp数组的初始化:我其实位置就是下标为0的位置,dp【0】 = 0;
- 一点一点推导,以示例一所示,到达最后一个位置,是我从3一步跳过去的,dp【nums。length - 1】 = 数组中是3的位置 + 1,而不是从前一个数开始加
- 所以dp【i】 = dp【j】 + 1,即使break,在当前位置可以蹦到想要的位置,那么下一个也可以。
class Solution {
public int jump(int[] nums) {
//尽量先用做一遍
// dp数组的定义:到达以i为结尾的位置,所需要的跳跃的最小步骤
int[] dp = new int[nums.length];
dp[0] = 0;
for(int i = 1;i < nums.length;i++){
for(int j = 0;j < i;j++){
if(nums[j] + j >= i){
dp[i] = dp[j] + 1;
break;
}
}
}
return dp[dp.length - 1];
}
}
贪心:
不得不感慨,贪心这种问题,没感觉就是没感觉,想不出来就是想不出来,甚至有时侯都不知道这玩意是不是贪心。但是动归还是可以写一写。
- 这个题目简单看就是一个区域覆盖的问题,当前值可以覆盖的区域范围为nums【i】 + i;这个值代表的是我可以到达的最远的地方,在遍历数组的过程中,发现我可以走到更远的位置了,记录一下,我继续接着走。(反正不看题解我想不出来)
- 值得注意的一点是不能把数组遍历完,i < nums.length - 1;题目中很明确说,你总是可以达到数组的最后一个位置,当我走到最后一个位置的时候,一定还会进去if的情况,总是会比所需要的值大1.
class Solution {
public int jump(int[] nums) {
//你别说,这种类型的题目看起来还是有一点感觉的,但是自己还好不会写啊
int curInstance = 0;
int nextInstance = 0;
int res = 0;
for(int i = 0;i < nums.length - 1;i++){
nextInstance = Math.max(nextInstance,nums[i] + i);
if(curInstance == i){
curInstance = nextInstance;
res++;
}
}
return res;
}
}