本算法利用Dijkstra算法,代码如下:
//#include<stdio.h>
//#include<stdlib.h>
//#include<math.h>
/*
创建两个数组,nums_status,nums_save,分别用来保存数组状态和到每一点的最小值
status值为1,代表可以到达,找出所有可达的点中路径(save)最短的(该节点已经找到了路径最小值,status设为2),再从此节点中找出可达节点,再次找最小值,直到所有节点都被遍历(status均为2)
*/
int jump(int* nums, int numsSize){
int i = 0, j = 0, k = 0, l = 0;
int min_mid, min_mid_position;
//int* nums = (int*)malloc(sizeof(int) * pow(10, 4));
int* nums_status = (int*)malloc(sizeof(int) * pow(10, 4));
int* nums_save = (int*)malloc(sizeof(int) * pow(10, 4));
if (nums == NULL) {
printf("ERROR");
}
//printf("%d", Size);
//int numsSize = 5;
//nums[0] = 2;
//nums[1] = 3;
//nums[2] = 1;
//nums[3] = 1;
//nums[4] = 4;
//for (i = 0; i < 5; ++i) {
// printf("%d\n", nums[i]);
//}
for (i = 0; i < pow(10, 4); ++i) {
nums_status[i] = 0;
nums_save[i] = 10000;
//printf("%d\n", nums_status[i]);
}
nums_status[0] = 1;
min_mid_position = 0;
nums_save[0] = 0;
//每次大循环代表一次遍历,会找出一个距离最小值
for (i = 1; i < numsSize; ++i) {
//将新添加的节点可达的节点状态改为待寻找
for (j = 1; j <= nums[min_mid_position] && min_mid_position + j < numsSize; ++j) {
if (nums_status[min_mid_position + j] == 1) {
nums_save[min_mid_position + j] = fmin(nums_save[min_mid_position + j], nums_save[min_mid_position] + 1);
}
else {
nums_save[min_mid_position + j] = nums_save[min_mid_position] + 1;
nums_status[min_mid_position + j] = 1;
}
}
++nums_status[min_mid_position]; //status值改为2,表示已经找到最短路径
min_mid = 10000;
//找距离的最小值,并保存到min_mid中(去除已经找到的,status为2)
for (l = 0; nums_status[l] != 0 && l < (numsSize-1); ++l) {
if (nums_status[l] == 1) {
if (min_mid > nums_save[l]) {
min_mid = nums_save[l];
min_mid_position = l;
}
}
}
//加了free会报错,不晓得为什么
//free(nums);
//free(nums_save);
//free(nums_status);
return nums_save[numsSize-1];
}