LeetCode-45. 跳跃游戏 II(中等)

LeetCode-45. 跳跃游戏 II (中等)

题目地址:https://leetcode-cn.com/problems/jump-game-ii

文章目录

  • LeetCode-45. 跳跃游戏 II (中等)
  • 1. 题目描述及示例
      • 示例一:
      • 示例二:
  • 2. 题解和代码实现
      • 代码实现(C++ 2022-3-15)
  • 3. 总结

1. 题目描述及示例

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

示例一:

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

示例二:

输入: nums = [2,3,0,1,4]
输出: 2

2. 题解和代码实现

      在这里典型的使用贪心算法。跳跃游戏有第一种判断能否跳到最后leetcode-55. 跳跃游戏;该题是在上述一题的基础上进行提出来,进行寻找跳到最后所用的最少的跳跃次数,已经给出,肯定能跳到最后
      首先我们得明白,对于nums = [2,3,1,1,4] ,当跳到第一步,它最远能够跳到坐标为2的位置(在这里以坐标0为起点),那么也即是第一步nums[1]和nums[2]均能抵达;那么第二步最远能到跳到那里,即max(nums[1]+1,nums[2]+1),所以一直到第x步,到达或超过最后的位置,在这里的每一步,都是尽可能的跳的更远,所以是典型的贪心算法。

代码实现(C++ 2022-3-15)

class Solution {
public:
    int jump(vector<int>& nums) {
        int length = nums.size(), count = 0, farthest = 0,end = 0;
        //只有一个位置,直接到达,需要进行定义
        if(length == 1){ 
            return 0;
        }
        // 进入循环
        for(int i=0;i<length;i++){
            if(farthest>=i){
                // 求解每一步最远之前的所能到达的最远距离
                farthest = max(farthest,i+nums[i]);
                // 循环到该步的最远位置
                if(i==end){
                    // 进入下一步的最远界定限
                    end = farthest;
                    count++;
                }
            }
            // 判断最终的是否超出该数组的位置
            if(end>=length-1)
                break;
        }
        return count;
    }
};

3. 总结

      对于代码的整体思路欢迎与大家一起讨论交流。

你可能感兴趣的:(#,贪心算法,leetcode,热题,HOT,100,leetcode,游戏,算法,职场和发展,动态规划)