本文主要是介绍力扣面试经典算法150题:跳跃游戏 II,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
跳跃游戏 II
今天的题目是力扣面试经典150题中的数组的中等难度题:跳跃游戏II。
题目链接:https://leetcode.cn/problems/jump-game-ii/description/?envType=study-plan-v2&envId=top-interview-150
题目描述
给定一个非负整数数组 nums,你最初位于数组的第一个位置。每个元素代表你在该位置可以跳跃的最大长度。你的目标是从数组的起始位置到达最后一个位置。求出到达最后一个位置所需的最少跳跃次数。
- 示例
- 输入:
nums = [2,3,1,1,4] - 输出:
2
- 输入:
- 示例 :
- 输入:
nums = [2,3,0,1,4] - 输出:
2
- 输入:
题目分析
昨天刚做完跳跃游戏的题目,昨天的题目只需要返回能否到终点即可,今天题目难度高一点,我们需要返回最少的次数,但是这个游戏的本质还是一样的。
解题思路
这个题目闭眼贪心算法,昨天刚解完,今天总不能忘了吧。
- 初始化三个变量:step 表示当前步数,maxReach 表示当前可以达到的最远位置,end 表示上一步可以达到的最远位置。
- 遍历数组,更新 maxReach。
- 当遍历到 end 时,增加步数,并更新 end 为新的 maxReach。
- 继续遍历直到结束。
实际算法代码
以下是使用上述思路的 Java 实现:
public class Solution {public static void main(String[] args) {Solution solution = new Solution();int[] nums = {2, 3, 1, 1, 4};int minJumps = solution.jump(nums);System.out.println("Minimum jumps: " + minJumps);}public int jump(int[] nums) {int step = 0;int maxReach = 0;int end = 0;for (int i = 0; i < nums.length - 1; i++) {maxReach = Math.max(maxReach, i + nums[i]);if (i == end) {step++;end = maxReach;if (end >= nums.length - 1) break;}}return step;}
}
可以看到,实际计算的代码比昨天也没多什么东西,就一个计算结果的步数,到结尾返回。只要题目理解的没问题,熟练使用贪心算法,解答还是很简单的。
结果
运行代码,测试通过:
提交到力扣,也正常通过:
总结
又是使用贪心算法的一天,已经连着解了好几个题了。
其实主要还是理解题目,掌握规律,使用恰当的代码编写,从暴力解法慢慢过渡到优秀解法,算法之力就是这么积累的。
加油!!!
这篇关于力扣面试经典算法150题:跳跃游戏 II的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!