首页 > 其他 > 详细

力扣刷题(45、跳跃游戏II)

时间:2021-01-19 19:52:26      阅读:36      评论:0      收藏:0      [点我收藏+]

题目描述

  题目直接截图于力扣(LeetCode)。

  该题网址:https://leetcode-cn.com/problems/jump-game-ii/

  我才发现英文版的题目他给出了约束条件,而中文貌似没有。吃了偷懒的亏,以后还是看英文吧,顺带还能学习一下英语。~(OvO)~

  下面是英文题目:

技术分享图片

    下面是中文题目:

技术分享图片

用到的算法思想

  【贪心算法】

需要注意的点

  并不是所有的贪心策略都能得到想要的最优解。

  此道题中,自然是每次跳跃都能够到达最优点,使得本次跳跃优势最大化。

  下面是我的思路:

      1(初始)、每次跳跃选择能该区间能进行下次跳跃最远的位置(即每次选择区间内【数值最大】的位置为本次跳跃终点)  (×) 错误案例:【10,9,8,7,6,5,4,3,2,1,1,1,0】

      2(改进)、错误原因:少考虑了一些因素。

        改进:每次跳跃时,选择【当前位置+当前位置可跳跃距离】即(【当前下标+当前位置的值】)最大的位置为本次跳跃终点。同时!!!,这个值还需要大于终点的下标值。

代码实现(C)

  

int jump(int* nums, int numsSize){
    int count = 0; // 记录跳跃次数
    int i = 0, j; // 控制循环
    int max = 0, now, next;
    if(numsSize <= 1) // 长度为1,直接结束
    {
        return 0;
    }
    while(1)
    {
        now = nums[i] + i;// 当前可以走的最远的路径
        if(now >= numsSize-1) // 能到达或超出则直接结束
        {
            count++; // 次数加一退出
            break;
        }
        max = nums[i+1] + i + 1; // 将下一步设为最大值
        for(j = i+1; j <= now; j++) // 从下一步开始,寻找最大值的位置
        {
            next = nums[j] + j;
            if(next >= max) // 当前值是否大于等于记录的最大值
            {
                i = j; // 记录最大值的下标
                max = next;
            }
        }
        if(max <= now)
        {
            i = now;
        }
        count++;
    }
    return count;
}

 

完成时间

  2021-01-19  12:48:53

  代码五分钟,找bug半小时,总共花了一个半小时时间........

力扣刷题(45、跳跃游戏II)

原文:https://www.cnblogs.com/static-love/p/14297343.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!