跳跃游戏-算法

发布时间:2024年01月22日

题目

给定一个数组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)

文章来源:https://blog.csdn.net/u010187815/article/details/135724298
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。