leetcode hard模式专杀之55. Jump Game

本文深入探讨了一种解决特定跳跃游戏问题的算法,通过遍历数组并使用染色概念来判断是否能到达最后一个元素。文章详细介绍了实现过程,并分享了作者在调试过程中遇到的挑战及解决方法。

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

这道题其实是medium模式,不过因为他是Jump Game II的前提,所以也一并做了,思路倒是不复杂,就是从头到位遍历,一边遍历,一边“染色”,不过这题让我提交了七八次才通过oj,前几次是超时,后几次修改是有些条件没考虑,所以是很值得仔细琢磨的一道题,思路是这样的,从0开始,想象可以往后染色,然后在染色范围内,继续往后染色,如果某次染色的最大index大于等于最后的index即length-1,则返回true,如果一直循环到最后还没有发现这样的情况,就返回false,当然仅仅按照这个思路,未必能写出通过oj的程序,还必须进行一些剪枝去除不必要的循环,例如假如某次循环到第k个位置时,发现k已经不在被染色的位置范围内了,说明没有必要继续往下走了,直接break出循环即可。好了上代码:


public class Solution {

    private void dye(int start, int end, Map<Integer, Boolean> dyeMap, int dyeEnd){
        for(int i = Math.max(dyeEnd, start); i<=end; i++){
            if(dyeMap.get(i)==null){
                dyeMap.put(i, true);
            }
        }
    }

    public boolean canJump(int[] nums) {
        int dyeEnd = 0;
        Map<Integer, Boolean> dyeMap = new HashMap<>();
        dye(0,0, dyeMap, dyeEnd);
        for(int i = 0 ;i<=nums.length-1;i++){
            if(dyeMap.size()>0){
                if(dyeMap.get(i)==null){
                    break;
                }
            }
            if(i+nums[i]>=nums.length-1){
                return true;
            }else{
                dye(i, i+nums[i], dyeMap, dyeEnd);
                dyeEnd = i+nums[i];
            }
        }
        return false;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值