贪心算法的使用

      贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解

       既然贪心总是在求局部最优,所有使用贪心要首先判断,我每次求局部最优,最后能不能达到全局最优。如果是,那么就可以使用贪心算法了。

45Jump Game II

题目描述:

Given an array of non-negative integers, you are initially positioned at the first index of the array.

Each element in the array represents your maximum jump length at that position.

Your goal is to reach the last index in the minimum number of jumps.

For example:
Given array A = [2,3,1,1,4]

The minimum number of jumps to reach the last index is 2. (Jump 1 step from index 0 to 1, then 3 steps to the last index.)


题目解析:

1. 此题的意思是:arr中的每一个数字表示从当前位置可以最远向后走几步,题目求的是:从第一个位置出发,最短需要几步到最后一个位置。

2. 做着一道题时:到了一个新的位置i:考虑的是下一步最远到哪个位置肯定是i+arr[i]。那么前进一步,下一次就是在i到i+arr[i]中找寻下一个最远能到达的位置。直到某一步到了最末端位置。考虑在到达第一次能够直接下一步到达最末位置的哪个位置j时,0到j位置我们都是有计算遍历过的,所以不会错过最优解,并且没走一步,找的都是最远到达的位置。所以这样的贪心出来的结果也是全局最优解。那么就可以使用贪心算法。


代码如下:

class Solution {
public:
    // 使用贪心算法来解决
    int jump(vector<int>& nums) 
    {
        if(nums.empty())
            return 0;
        // 使用cur来记录当前步的最远到达位置,使用pre来记录上一步最远到达的位置
        int cur = 0, pre = 0;
        // res为需要走的步数
        int res = 0;
        int i=0;
        while(cur < nums.size()-1)
        {
            pre = cur;
            while(i <= pre)
            {
                // 寻找这一步中最远可以到达的位置
                cur = cur < nums[i] +i ? nums[i] +i : cur;
                ++i;
            }
            // 步数+1
            ++res;
            // 加上pre==cur判断,如果上一步和这一步走的最远位置一样,说明不能到达更远了,结束了。
            if(pre == cur) 
                return -1;
        }
        
        return res;
        
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值