zoukankan      html  css  js  c++  java
  • 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++;
            }
        }
    }
    

    运行结果

  • 相关阅读:
    系统架构师基础到企业应用架构表现层
    网站性能优化之应用程序缓存中篇
    系统架构师基础到企业应用架构企业应用架构
    系统架构师基础到企业应用架构服务层
    http的请求和响应过程管道
    反射获取信息图(转)
    白话学习MVC(二)页面周期一
    Asp.Net请求原理and页面生命周期(转)
    前后台互访
    HttpApplication事件&ASP.NET页面周期
  • 原文地址:https://www.cnblogs.com/code-fun/p/13789247.html
Copyright © 2011-2022 走看看