| 题目选自Leetcode 45. 跳跃游戏 ||?
  
 ?与跳跃游戏 | 的不同之处在于,我们需要求的是最少的跳跃次数~ 题目描述:
? 解题思路: 
 思想就一句话:每次在上次能跳到的范围(end)内选择一个能跳的最远的位置(也就是能跳到max_far位置的点)作为下次的起跳点 ! 详解:规的思维就是暴力穷举,把所有可行的跳跃方案都穷举出来,计算步数最少的。穷举的过程会有重叠子问题,用备忘录消除一下,就成了自顶向下的动态规划。 不过直观地想一想,似乎不需要穷举所有方案,只需要判断哪一个选择最具有「潜力」即可,这就是贪心思想来做,比动态规划效率更高。 
 ?比如上图这种情况,我们站在索引 0 的位置,可以向前跳 1,2 或 3 步,你说应该选择跳多少呢? 显然应该跳 2 步调到索引 2,因为?nums[2]?的可跳跃区域涵盖了索引区间?[3..6],比其他的都大。 这就是思路,我们用?i?和?end?标记了可以选择的跳跃步数,farthest?标记了所有选择?[i..end]?中能够跳到的最远距离,jumps?记录跳跃次数。 看不懂? 再来详解:
  ? 
 ? 解题代码:int jump(int* nums, int numsSize){
    if(numsSize == 1) return 0;
    int end = 0 , farthest = 0;
    int jumps = 0;
    for(int i = 0; i < numsSize - 1; i++){
        farthest = fmax(nums[i] + i , farthest); //记录当前能到达的最远距离
        if(end == i){
            jumps++;
            end = farthest; //模拟每次能跳到的最远距离,然后“跳到”最远距离上,这时步数+1
            //当end == i 时表示,上一次跳jumps次已经到最大距离了,之后的距离肯定得+1
        }
    }
    return jumps;
}
 
? |