继续打卡算法题,今天学习的是LeetCode第45题跳跃游戏 II,这道题目是道中等题
。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码思维和编码能力有一些提升。
分析一波题目
先说说暴力解法,把每个位置到最终位置的跳跃次数全部记录下来,结果排序之和取最小的,这样想想比较简单,但是这样写代码复杂度增高了,需要两层循环,相当于时间复杂度O(m*n)。
有没有一层循环的办法呢?有的,我们循环每个数组元素,如果当前跳跃的大小比之前的位置小,就不跳跃,大于等于的情况才跳跃。
本题解题技巧
1、使用一层循环,不是每次都跳跃,而是等跳跃的位置比之前的都大的时候才跳跃
编码解决
class Solution {
public int jump(int[] nums) {
int length = nums.length;
int end = 0;
int maxPosition = 0;
int steps = 0;
for (int i = 0; i < length - 1; i++) {
maxPosition = Math.max(maxPosition, i + nums[i]);
//每次跳跃,选最大能跳跃的一个, 已经到上次跳跃后的最大位置,这个时候需要跳跃了
if (i == end) {
end = maxPosition;
steps++;
}
}
return steps;
}
}
总结
这个跳跃游戏使用暴力解法比较麻烦,通过一层循环,不断的找最大可以跳跃的地方,达到了上次最大跳跃的地方再跳跃一次。