Leetcode 55. Jump Game

描述

Given an array of non-negative integers, you are initially positioned at the first index of the array.

Each element in the array represents your maximum jump length at that position.

Determine if you are able to reach the last index.

For example:
A = [2,3,1,1,4], return true.

A = [3,2,1,0,4], return false.

分析

  • 首先想到的是回溯法,如list = [2,3,1,1,4], 第一个为2,然后通过递归再跳到list[2]的地方,然后list[2] = 1, 再递归跳到list[3]的地方。。。。。
  • 这样的办法,一定会产生重复计算,且递归返回条件也不是很容易写,但我们分析一下发现可以使用动态规划,从list的尾部开始,用一个boolean数组b[],从后往前推算, 这里的推算要走(nums[i : i+nums[i]])。最后只要b[0] == true就代表可以到达。
但是结果如下,最后一个测试爆了。。。
  • 75 / 75 test cases passed.
  • Status: Time Limit Exceeded
  • Submitted: 0 minutes ago

贪心法

  • 这道题可以使用贪心法, 但是我其实对贪心法不太熟练
  • 通过观察,可以发现最后一个值肯定可以到最后,那倒数第二个呐,倒数第三个呐?
  • 假设A = [3,1,0,1,4], 从后往前找,发现在A[2]这个地方桥断了,那必须在之前要找一个能飞过这个断桥的地方,A[1]飞不过去不管他,A[0]能够飞过去。

代码

动态规划
public class Solution {

    public boolean judge(boolean[] b, int s, int e){
        for (int i = s+1; i <= e; i++){
            if (b[i] == true)
                return true;
        }
        return false;
    }

    public boolean canJump(int[] nums) {
        int n = nums.length;
        boolean[] b = new boolean[n];
        b[n-1] = true;
        for (int i = n - 2; i >= 0; i--){
            if (i + nums[i] >= n-1)
                b[i] = true;
            else{
                b[i] = judge(b, i, i + nums[i]);
            }
        }
        return b[0];
    }
}
贪心法
public class Solution {
    public boolean canJump(int[] nums) {
        int lastPos = nums.length - 1;
        for (int i = nums.length - 1; i >= 0; i--) {
            if (i + nums[i] >= lastPos) {
                lastPos = i;
            }
        }
        return lastPos == 0;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值