跳跃游戏-算法

文章介绍了两种方法解决给定数组中,从起始位置跳跃到达末尾所需的最小步数问题:反向查找和正向查找。反向查找的时间复杂度为O(n^2),空间复杂度为O(1);正向查找优化了时间复杂度至O(n),空间复杂度同样为O(1)。
摘要由CSDN通过智能技术生成

题目

给定一个数组nums = {1,2,3,4,5},每个元素nums[i]表示从i这个位置最多可以向前跳跃nums[i]个台阶,求最小需要跳几次就可以调到末尾

思路

反向查找

从末尾开始逐个向前判断最远的起跳位置,接着再以该位置递归的判断

public int jumpToTheEndWithMinSteps(int[] nums){
    int position = nums.length-1;
    int steps = 0;
    while(position>0){
        for(int i=0;i<position;i++){
            if(i+nums[i]>=position){
                position = i;
                steps++;
                break;            
            }        
        }    
    }
    return steps;
}

效果

时间复杂度:O(n^2)

空间复杂度:O(1)

正向查找

从i=0位置开始向后找,每次在当前最远位置如i,计算从i开始跳跃空间nums[i]内这个区间内能够跳的最远位置是哪里,然后以此类推

public int jumpToTheEndWithMinSteps(int[] nums){
    int length = nums.length;
    int end = 0;
    int maxPosition = 0;
    int steps = 0;
    for(int i=0;i<length;i++){
        //计算i<j<=end区间内能够跳的最远的位置,将其记录为maxPosition
        maxPosition = Math.max(maxPosition,i+nums[i]);
        //每次区间结束,都更新一下最新调的最远的位置
        if(i==end){
            end = maxPosition;
            steps++;        
        }    
    }
    return steps;
}

效果

时间复杂度:O(n)

空间复杂度:O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慢一点,细一点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值