题目直接截图于力扣(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(改进)、错误原因:少考虑了一些因素。
改进:每次跳跃时,选择【当前位置+当前位置可跳跃距离】即(【当前下标+当前位置的值】)最大的位置为本次跳跃终点。同时!!!,这个值还需要大于终点的下标值。
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半小时,总共花了一个半小时时间........
原文:https://www.cnblogs.com/static-love/p/14297343.html