解题思路
性质:
如果i是从i-1跳一步到达的,那i位置的最少跳数是<i> = <i-1>+1;
如果i是从i-2或是之前跳到的,则有<i> = <i-1>
即有<i> >= <i-1>.
利用贪心算法,每次求取当前阶段的最优解,最终得到最后的结果。
目标函数:max(cur,i+A[i])//求局部最优解
方案一
时间复杂度:O(n)
空间复杂度:O(1)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16public int jump(int[] nums) {
int ret = 0;// 当前跳数
int last = 0; // 上一跳可达最远距离 :ret
int cur = 0;// 当前一跳可达最远距离 :ret + 1
for (int i = 0; i < nums.length; i++) {
// 需要进行下次跳,需要更新last和当前执行的跳数
// i 不仅是数组下标, 还是已经到达的距离
if (i > last) {
last = cur;
++ret;
}
// 记录当前可达的最远点,保证每次以尽可能大的步伐往后跳
cur = Math.max(cur, nums[i] + i);
}
return ret;
}
方案二
把问题转换成BFS问题。
第i层节点是指那些可以通过i-1步跳跃到达的节点。
例如:2 3 1 1 4, 可以看成 2 || 3 1 || 1 4
1 | public int jump1(int[] nums) { |