【LeetCode】45. 跳跃游戏 II

55 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

题目

给你一个非负整数数组 nums ,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

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

示例 1

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

示例 2

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

提示

  • 1 <= nums.length <= 10^4
  • 0 <= nums[i] <= 1000

题解

思路

这个题目是给你一个非负整数数组 nums ,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

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

这个题我们可以看一下例子:输入: nums = [2,3,1,1,4]

一开始我们起始位置是0,然后我们看第一个索引是2,,这时我们就有了选择,可以走一步,也可以走两步,那到底走几步呢?取决于后面选哪个走的更远,如果走一步走的更远,我们就走一步,反之,我们走2步,走一步到1的位置,答案加1,1+3 =4,如果走两步,走到2的位置,往后只能走一步,走到3,但4包括3的策略,所以我们走一步。

确定操作对象:本题中,操作对象1个nums 确定操作条件:看看之后走的步数,大不大于原来的步数,大于就从这开始走 确定操作过程:先走一步,看看之后能走几步,选一个往后走的步数最大的位置,就是我们下一步要去的位置。 确定结果返回:返回最终结果。

代码

class Solution {
public:
    int jump(vector<int>& nums) {
        int ans = 0;
        int start = 0;
        while(start < nums.size()-1){
            int end = start+nums[start];//move
            ans++;
            if(end >= nums.size()-1) return ans;
            int next = end;
            for(int i = start+1; i<=end;i++){
                if(i+nums[i]>next){
                    next = i+nums[i];
                    start=i;
                }
            }

            // ans++;
        }
        return ans;
    }
};

结语

业精于勤,荒于嬉;行成于思,毁于随。