[LeetCode-45] 基于贪心算法的跳跃游戏 II-最少跳跃次数的求解(C语言版)

/*

题目出处:LeetCode

题目序号:45. 跳跃游戏 II

题目叙述:给定一个长度为 n 的整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处,返回到达 nums[n - 1] 的最小跳跃次数。

*/

贪心策略:

每次跳跃从可选择的位置中选择跳到可以达到最远距离的位置。

思路:

(1)每次 index 变动时,跳跃次数加 1;

(2)结束条件判定:当 jump[ index ] ≥ length 时,跳跃次数加 1 结束。

程序清单

#include<stdio.h>

#define OK 1

typedef int Status;

Status TestJumpTimes(int *nums, int length) {

int i;

int count = 0; // 跳跃次数

int index = 0; // 起点位置

int jump[length]; // 记录当前位置可达到的最远距离

for(i = 0; i < length; i++){

jump[i] = i + nums[i];

}

if (length == 1) {

printf("您已在终点,无需跳跃,所需的最少跳跃次数为 0 次。"); // 如果起始位置就是终点,则可以到达

return OK;

}

while(jump[index] < length - 1){

int left = index + 1;

int right = jump[index];

int temp = left; // 保存最远位置对应的索引

while (left < right) { // 寻找可跳的位置

if(jump[temp] < jump[left + 1]) {

temp = left + 1;

}

left++;

}

printf("\n");

index = temp; // 跳跃

count++; // 跳跃次数加 1

}

count = count + 1; // 最后一次跳跃

printf("所需的最少跳跃次数为 %d 次。", count);

return OK;

}

int main() {

int n,i;

printf("请输入您想测试的数组的长度:\n");

scanf("%d",&n);

int a[n];

printf("请输入数组元素:\n");

for (i=0;i<n;i++){

scanf("%d",&a[i]);

}

TestJumpTimes(a,n);

return 0;

}

运行结果

相关推荐
Fuyo_111911 小时前
C++中的活字印刷术——模板·初阶
开发语言·c++·笔记
小白|11 小时前
cmake:昇腾CANN构建系统完全指南
java·c++·算法
nebula-AI11 小时前
人工智能导论:模型与算法(未来发展与趋势)
人工智能·神经网络·算法·机器学习·量子计算·automl·类脑计算
王老师青少年编程11 小时前
2026年全国青少年信息素养大赛“算法应用主题赛”(初赛)【C++考点大纲】(全场景、组别):文末附备考秘籍!
c++·全国青少年信息素养大赛·初赛·2026年·算法应用主题赛·考点大纲
炽烈小老头11 小时前
【每天学习一点算法 2026/05/21】课程表
学习·算法
Season45011 小时前
C++之模板元编程(前置知识 constexpr)
开发语言·c++
luoganttcc11 小时前
大模型是否即将到达算法极限
算法
咩咦12 小时前
C++学习笔记22:前置后置 ++/-- 和日期减日期
c++·学习笔记·运算符重载·日期类·前置++·后置++·日期减日期
计算机安禾12 小时前
【c++面向对象编程】第40篇:单例模式(Singleton)的多种C++实现
开发语言·c++·单例模式
叶小鸡12 小时前
小鸡玩算法-力扣HOT100-动态规划(上)
算法·leetcode·动态规划