LeetCode.45 跳跃游戏 II

本文介绍了如何使用贪心算法解决LeetCode题目《Jump Game II》。博主展示了如何从起点出发,通过选择每步最大距离来找到最少跳跃次数。通过实例演示了代码实现和关键步骤的解释。

原题

https://leetcode-cn.com/problems/jump-game-ii/

在这里插入图片描述
思路
贪心策略,从起点开始,每步都去选择走最大距离(当前步跨越距离+下一步可走最大距离)

题解

package com.leetcode.code;

/**
 * @ClassName Code45
 * @Author ZK
 * @Description
 * @Date 2021/1/27 14:50
 * @Version 1.0
 **/
public class Code45 {

    public static void main(String[] args) {
//        int[] nums = {2,3,1,1,4,2,4,6,1,4,7,2,4,1,1,3,2,2,3,1,1,1,4};
        int[] nums = {9,7,9,4,8,1,6,1,5,6,2,1,7,9,0};
        int count = jump(nums);
        System.out.println("count:" + count);
    }

    public static int jump(int[] nums) {
        int len = nums.length;
        int steps = 0;

//        如果数组中只有一个元素,返回0,不用走
        if (len == 1){
            return steps;
        }

//        模拟跳跃走路的过程,每次i直接走到下一个目标点,所以for对应的括号内没有标明迭代变量的变化i++这样的等式
        for (int i = 0; i < len; ) {
//            确定下一步走到哪里,也就是确定迭代变量i下一步的位置下标
            i = max(nums, i + 1, i + nums[i]);
//            走一步,步数+1
            steps++;
//            如果最后一步走完到达数组末尾,或者超出数组,则直接break
            if (i >= len-1) {
                break;
            }
        }
        return steps;
    }

    /**
     * 下一步最优走到哪里
     * 例如:例:[3,2,0,1,4] 从3开始走,此时遍历范围就是[2,0,1]
     * begin:1  end:3   return:3
     * @param nums  原始数组
     * @param begin 下一步的起始下标(包含)
     * @param end   下一步的终止下标(包含)
     * @return      下一步应走到哪里 的下标
     */
    public static int max(int[] nums, int begin, int end){
//        如果这一步最后可以走到数组的末尾,或者可以超出数组,直接返回
        if (end >= nums.length-1) {
            return end;
        }
        int res = begin;
        for (int i = begin+1; i <= end; i++) {
//            走到哪一步,以及下一步可以走的更远
//            例:3,2,0,1,4 从3开始走
//            ① 3->2->1->4
//            ② 3->1>4
//            应选择方案2,但是在3的步骤内,2比1大,此时应该是2+1 < 1+3   选择(下一步可以走多远+本次走了几步)最大值
//            即 防止3->2->1这样的事件发生,而应该直接是3->1,也就是在一个大步内防止走两次才走出去
//            上边是原式,下边是化简之后的结果
//            if (i < nums.length && nums[i]+(i-begin)+1 >= nums[res]+(res-begin)+1) {
            if (i < nums.length && nums[i]+i >= nums[res]+res) {
                res = i;
            }
        }
        return res;
    }

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

难过的风景

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

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

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

打赏作者

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

抵扣说明:

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

余额充值