leecode 45.跳跃游戏

本算法利用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];
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值