leetcode第45题,跳跃游戏

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值