LeetCode 55. 跳跃游戏 ( 回溯 dp 贪心

本文介绍了LeetCode第55题的解决方案,从回溯搜索算法的角度出发,讨论了如何通过动态规划(DP)来优化解题效率,尽管DP解法比回溯慢,但对于该问题,应优先考虑使用DP策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个题字节一面做过 不过当时没想到好的解法

首先能写出一个回溯的搜索算法:

class Solution {
    private boolean[] vis;
    private boolean dfs(int[] nums,int cur){
        if(cur==nums.length-1){
            return true;
        }
        boolean rs=false;
        vis[cur]=true;
        for(int i=1;i<=nums[cur];i++){
            // 向右/向左
            // 👆 指正,这里是不需要向左跳的,不过即使如此也过不了qaq
            if(cur+i<nums.length&&!vis[cur+i]){
                vis[cur+i]=true;
                rs=rs||dfs(nums,cur+i);
                vis[cur+i]=false;
            }
        }
        return rs;
    } 
    public boolean canJump(int[] nums) {
        vis=new boolean[nums.length];
        return dfs(nums,0);
    }
}

超时

突然想到这个题很适合用dp来做:

class Solution {
    public boolean canJump(int[] nums) {
        // dp[i]表示从第i个位置出发,能否到达终点
        // 递推公式:dp[i]=dp[i+1] || dp[i+2] || ... || dp[i+nums[i]]
        boolean[] dp=new boolean[nums.length];
        dp[dp.length-1]=true;
        for(int i=dp.length-2;i>=0;i--){
            // 从当前点,判断所有他能到达的点,看能否到达
            for(int j=1;j<=nums[i];j++){
                if(dp[i+j]){
                    dp[i]=true;
                    break;
                }
            }
        }
        return dp[0];
    }
}

虽然挺慢的

最妙的还是这个(,虽然不是不能马上想到,这个题dp应该是能马上想到的

class Solution {
    public boolean canJump(int[] nums) {
        // reach表示能通过跳跃到达的最远位置
        int reach=0;
        for(int i=0;i<nums.length;i++){
            if(i>reach){
                // 当前遍历到的位置,是不能通过跳跃到达的
                // 那么自然也到不了终点
                return false;
            }
            reach=Math.max(reach,nums[i]+i);
        }
        // 上述循环走完,说明对于终点,也是可以通过跳跃到达
        return true;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值