贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
既然贪心总是在求局部最优,所有使用贪心要首先判断,我每次求局部最优,最后能不能达到全局最优。如果是,那么就可以使用贪心算法了。
45. Jump 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;
}
};