Leetcode 045. 跳跃游戏 II 贪心

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

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

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

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

示例:

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

解答

由于题目要求是可以跳跃的最大长度而不是必须要跳的长度

那么 num[i]+i 是能达到的最远元素索引 那么他就可以包含其他选择所能达到的位置 

所以我们使用贪心策略  每次选择 nums[i]+i 能达到最远的索引即可

道理很清晰 但是代码考虑到边界问题后 组织起来还是有一番难度的

class Solution {
public:
    
    int jump(vector<int>& nums) {
    if (nums.size() == 1) return 0;
    int maxpos = 0;
    int step = 1;
    while (maxpos < nums.size() - 1) {
        if (nums[maxpos] + maxpos >= nums.size() - 1) 
            return step;
        int maxr = -1; int maxidx = -1;
        for (int i = 1; i <= nums[maxpos]; i++) {
            int idx = maxpos + i;

            if (maxr < nums[idx] + idx) {
                maxr = nums[idx] + idx;
                maxidx = idx;
            }
        }
        maxpos = maxidx;
        step++;
    }

    return step;
}
    
};

 

上一篇:LeetCode-045-跳跃游戏 II


下一篇:Datawhale组队学习周报(第045周)