题解 | #跳跃游戏(三)#

跳跃游戏(三)

https://www.nowcoder.com/practice/d92a70f4f42248d688b93c9e50d2e757

「贪心」地进行正向查找,每次找到可到达的最远位置,就可以在线性时间内得到最少的跳跃次数。

#include <cstdio>
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int nums[N];
int n;
int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &nums[i]);
    }
    //初始化最远位置标记far
    int far = nums[0];
    int ans = 1;
    if (n == 1)
        printf("0");
    else {
        for (int i = 0; i < n; i++) {
            int tmpi = i;
            int tmp = 0;
            // 在(i,far] 中找能到达的最远位置
            for (int j = i + 1; j <= far; j++) {
                if (nums[j] + j > tmp) {
                    tmp = nums[j] + j;
                    tmpi = j;
                }
            }
            //在范围内没找到,说明到达不到最后,跳出循环
            if (tmpi == i) {
                break;
            } else  // 次数加1
                ans ++;
            far = tmp;  // 更新最远位置
            if (far >= n - 1)// 如果最远位置 可以到达最后的位置,跳出循环
                break;
            i = tmpi - 1;  // 最后更新下次循环的起始位置,i=tmpi-1,for里面还有+1,所以下一次的遍历起始位置是tmpi,就是本次找到的最远位置的起跳位置
        }
        if (far >= n - 1)
            printf("%d", ans);
        else
            printf("-1");
    }

    return 0;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

2024-12-30 22:49
长沙理工大学 Java
神哥了不得:没什么可以指导的地方了,简历确实牛,我大号分享过投递策略,广投就行
点赞 评论 收藏
分享
01-02 00:50
三峡大学 Java
程序员牛肉:这简历一出手就离失业不远了。 作为一家公司来讲,我如果要招日常实习生,那我对实习生最基本的要求就是要能干活,毕竟你就待三四个月,谁会留心培养你? 那么除了院校之外,最重要的就是项目和实习了。没有实习的话项目就好好搞。 但是你说你这个项目吧:课程作业管理系统和TMS运输管理系统。这两个基本就和闹着玩差不多。 你作为一个想要应聘Java开发实习生的人,对后端的理解还仅仅停留在:“使用mapper和sql映射”,“使用SQL进行多表调用”,“基于MySQL简历表结构”,“基于Spring boot完成CURD操作”这种玩具上......... 找不到后端实习的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务