• Leetcode之跳跃游戏Ⅱ


    问题描述

    给定一个非负整数数组,你最初位于数组的第一个位置。
    数组中的每个元素代表你在该位置可以跳跃的最大长度。
    你的目标是使用最少的跳跃次数到达数组的最后一个位置。

    示例:

    输入: [2,3,1,1,4]
    输出: 2
    解释: 跳到最后一个位置的最小跳跃数是 2。
    从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

    说明:

    假设你总是可以到达数组的最后一个位置。

    问题解法

    我们总是可以到达数组的最后一个位置但是要保证跳数最少。我们就要保证我们选的这一步可以跳的更远。假设在某个位置我们可以从i跳到i+a[i]这个位置,在这之间的任意位置我们都可以达到,那么最优的一定是(i,i+a[i]]之间最大的那个即max=max(j+a[j])i<j<=i+a[i]。再从这个位置继续向下跳,这个时候我们已经遍历过i+a[i]了(都没有当前这个位置大,我们再次遍历的时候就要从i+a[i]开始。因此我们需要将这个值记录下来。
    除此之外就是特殊情况。当数组只有一个数时,只要能跳的步数合法可以到达(一定合法,题目要求)。

    class Solution {
        public int jump(int[] nums) {
            if(nums.length==1&&nums[0]>=0)
                return 0;
            //num计数,max表示当前可以y跳到的最远距离,maxIndex标识t从maxIndex跳才能达到最远距离,index表示已经记录过的下标。x是上一次的最大下标因为随着max的更新for的条件判断会改变。
            int num=1,max=nums[0],maxIndex=0,x=0,index=0;
            while(true){
                if(max>=nums.length-1)
                    return num;
                for(int i=index+1;i<=x+nums[x];i++){
                    if(i+nums[i]>max){
                        max=i+nums[i];
                        maxIndex=i;
                    }
                }
                index=nums[x]+x;
                x=maxIndex;
                num++;
            }
        }
    }
    

    运行结果

  • 相关阅读:
    Optional的使用
    Spring Boot 传送门
    MP(MyBatis-Plus)实现乐观锁更新功能
    实现数据逻辑删除的一种方案
    凹凸技术揭秘 · 基础服务体系 · 构筑服务端技术中枢
    凹凸技术揭秘 · 夸克设计资产 · 打造全矩阵优质物料
    凹凸技术揭秘·羚珑页面可视化·成长蜕变之路
    90%的开发都没搞懂的CI和CD!
    Devops与敏捷二者能否结合?
    优质单元测试的十大标准,你有遵循吗?
  • 原文地址:https://www.cnblogs.com/code-fun/p/13789247.html
Copyright © 2020-2023  润新知