[贪心]leetcode45:跳跃游戏 Ⅱ(hard)

题目:
[贪心]leetcode45:跳跃游戏 Ⅱ(hard)_第1张图片
题解:

  • 本题主要使用了贪心的策略,我们每次在可跳范围内选择可以使得跳的更远的位置。
  • 比如[2,3,1,1,4]元素2可跳范围为[3,1],那么我们的下一次起跳必须在选择元素3的可跳范围[1,1,4](因为可跳的距离最远),这样我们跳两次就能跳到最后一个位置了。写代码的话,我们用 end 表示当前能跳的边界,在遍历数组的时候,到了边界,我们就重新更新新的边界。
  • 具体可参考:大佬的解法。

代码如下:

class Solution {
public:
    //解法1:顺藤摸瓜
    int jump_1(vector<int>& nums) {
        if(nums.empty())return 0;
        int end=0,m=0,step=0;
        //注意这里边界为size-2,因为倒数第二个元素之前的元素就能跳到末尾位置了,所以需要排除倒数第二个元素,避免多跳一次
        for(int i=0;i<nums.size()-1;++i)
        {
            m=max(m,i+nums[i]);//能跳到的最远距离
            if(i==end)//遇到边界,更新边界,也就是更新最远距离,步数+1
            {
                end=m;
                step++;
            }
        }
        return step;
    }

    //解法2:顺瓜摸腾
    int jump(vector<int>& nums) {  
        if(nums.empty())return 0;    
        int pos=nums.size()-1;
        int step=0;
        while(pos!=0)
        {
            for(int i=0;i<pos;++i)
            {
                if(nums[i]>=pos-i)
                {
                    pos=i;
                    step++;
                    break;
                }
            }
        }
        return step;
    }
};

你可能感兴趣的:(leetcode刷题,#,贪心)